Мой strstr () возвращает ноль, даже если найденная строка имеет индекс 0 - PullRequest
1 голос
/ 03 октября 2010

Я сам реализовал strstr (), код отлично работает для всех строк, но когда строка находится в первом индексе строки, она возвращает ноль.

#include<stdio.h>

const char* mystrstr(const char *str1, const char *str2);

int main()
{
 const char *str1="chal bhai nikal";
 const char *str2="c",*result;
 result=mystrstr(str1,str2);
 if(*result!=NULL)
 printf("found at %d location and the value is %s.",*result, str1+*result);
 else
 printf("Value not found");
 getchar();
 printf("\n");
 return 0;
}

const char * mystrstr(const char *s1, const char *s2)
{
 int i,j,k,len2,count=0;
 char *p;

 for(len2=0;*(s2+len2)!='\0';len2++); //len2 becomes the length of s2
 for(i=0;*(s1+i)!='\0';i++)
 {
  if(*(s1+i)==*s2)
  {
  for(j=i,k=0;*(s2+k)!='\0';j++,k++)
   {
    if(*(s1+j)==*(s2+k))
    count++;
    else count=0;
    if(count==len2)
    {
     p=(char*)malloc(sizeof(char*));
     *p = i;
     return p;
    }
   }
  }
 }
 return NULL;
}

Ответы [ 2 ]

3 голосов
/ 03 октября 2010

Проблема в том, что вы возвращаете индекс в памяти, на который указывает char* (и в данном конкретном случае соответствующий индекс равен 0, который ваш код интерпретирует как NULL, когда он проверяет разыменованный result).Если вы хотите, чтобы mystrstr() имел то же поведение, что и strstr(), вы должны изменить:

if(count==len2)
{
 p=(char*)malloc(sizeof(char*));
 *p = i;
 return p;
}

на:

if(count==len2)
{
  return s1+i;
}

, чтобы возвращался указатель на расположение подстроки.

strstr() не возвращает индекс (или указатель на индекс) - он возвращает указатель на символ в строке, переданной в качестве первого параметра, где найден экземпляр str2 (еслинашлось).Я предполагаю, что ваше намерение состоит в том, чтобы mystrstr() следовал этой спецификации.

Итак, вам также необходимо изменить код, который проверяет возвращаемое значение и обрабатывает его, но я оставлю это в качестве упражнениядля читателя.

3 голосов
/ 03 октября 2010

Я не смотрел на вашу mystrstr функцию, просто main.

const char *str2="c",*result;
result=mystrstr(str1,str2);
if(*result!=NULL)
printf("found at %d location and the value is %s.",*result, str1+*result);
else
printf("Value not found");

result - это const char *; *result является const char.

Возможно, вы смешиваете NULL pointer и NUL zero-terminator?

result может быть NULL; *result может быть '\0'


Редактировать: возможное решение

Когда strstr () не может найти подстроку, возвращается NULL. Предположим, что ваш mystrstr () работает так же, вы делаете

/* result=mystrstr(str1,str2); */
result=NULL;

, а затем

if(*result!=NULL) {/* ... */} else {}

но *result может попытаться разыменовать нулевой указатель, который НЕ , что вы хотите.
Вы хотите проверить result себя

if (result != NULL) { /* ... */ } else {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...