2010-08-31 8 views
1

Я реализовал strstr(), но код не работает, пожалуйста, помогите:ошибка реализации strstr() функция

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<string.h> 
char* mystrstr(char*,char*); 
int main() 
{ 
    char *s1,*s2,*flag; 
    printf("Enter a string:\n "); 
    gets(s1); 
    printf("Enter a word to find in it:\n"); 
    gets(s2); 
    flag=mystrstr(s1,s2); 
    if(flag) 
     printf("Word found\n"); 
    else 
     printf("Word not found"); 
    getch(); 
    return 0; 
} 
char* mystrstr(char* s1,char* s2) 
{  int flag=0,j,i; 
    char* temp; 
    for(i=0;i<strlen(s1);i++) 
    { if(*(s1+1)==s2[0]) 
     { 
      for(j=1;*s2;j++) 
      { 
      if(*(s1+i)==*(s2+j)) 
      flag=1; 
      else 
      flag=0; 
      } 
     } 
    } 
    if(flag) 
    { 
    temp=(char*)malloc(sizeof(char*)); 
    itoa(j,temp,10); 
    return *temp; 
    } 
    return 0; 


} 
+1

Какой ошибки вы получаете – Dotnet

+0

ошибку Сообщи в itoa –

+0

какие проблемы вы сталкиваетесь «Не работает ли так, как вы хотите? –

ответ

3

Некоторые быстрые подсказки:

  1. Выделяют memory к указателям или использовать arrays
  2. Подробнее о pointer arithmetic здесь
  3. Читайте о strstr и подумайте об этом алгоритме или о Google
  4. Подробнее о itoa, в частности, читать return value.
0
for(i=0;i<strlen(s1);i++) 
{ 

     for(j=0;strlen(s2);j++)//and here 
     { 
     if(*(s1+i+j)==*(s2+j)){//here 
     flag=1;} 
     else{ 
     flag=0;break} 
     } 
if(flag){break;} 

} 
+0

Исправьте меня, если я сделал что-то неправильно, потому что я не очень много слышал о нем. – oneat

3

Для начала, вы можете прочитать о том, как «получает» работает: http://en.wikipedia.org/wiki/Gets

Вы просто объявляя указатели на стек в главном-метода. Эти указатели, вероятно, укажут на случайную память. Как уже упоминалось выше, вам придется выделять память либо в куче, используя «malloc» (s1 = malloc(256);), либо в стеке с f.ex. 'char s1[256];' и т.д., а затем передавая адрес для его получает с 'gets(&s1);' вместо

+0

получает (s1); , not gets (& s1) – nos

+1

Что я имел в виду, так это то, что вам придется использовать get (&s1);, если вы выделяете память в стеке «char s1 [256]». Не при использовании указателя и malloc вы correct ( – sewa

+1

) Нет. Это не имеет ничего общего с стекю и malloced memory. get (&foo); неверно, если это char foo [32], и это неправильно, когда это char * foo = malloc (32); – nos

1

conio.h не ANSI C

Геч не ANSI C

itoa не является ANSI C

Ваша функция возвращает строку, содержащую номер позиции в s2. Это правильно для вас?

Возврат должен быть освобожден.

Знаете ли вы доступ к массиву? Лучше *(s2+j)s2[j].

if(*(s1+1)==s2[0]) должно быть if(*(s1+i)==s2[0]) или нет?

for(j=1;*s2;j++) должно быть for(j=1;s2[j];j++) или нет?

В случае flag=0 перерыв отсутствует, см. Другие ответы.

0

Вы проверили первые буквы?

if(*(s1+1)==s2[0]) // you are checking s1[1] against s2[0] 

Это бесконечный цикл, если s2 [0] является нулевым символом в первую очередь, или вы нарушите из цикла, используя перерыв;

for(j=1;*s2;j++) 

recrusive подход для справки:

char* my_strstr(char* s1, char* s2) { 
    // return null pointer for empty strings 
    if (strlen(s1) == 0 || strlen(s2) == 0) 
    return 0; 

    // recursive part 
    if (s1[0] == s2[0]) { 
    if (strlen(s2+1) == 0 || (strlen(s2+1) != 0 && my_strstr(s1+1, s2+1) == s1+1)) 
     return s1; 
    } 
    else return 0; 
} 
+0

Ваш код, похоже, не работает с моим другом. Он не находит строку. –

0

Java-код для реализации strstr()

class Solution { 
public int strStr(String haystack, String needle) { 
    String res =""; 
    int pos = 0; 
    if(needle.length() == 0){ 
     return 0; 
    } 
    if(haystack.equals(needle)){ 
     return 0; 
    } 
    if (needle.length()>haystack.length()||haystack.length() == 0){ 
     return -1; 
    } 
    for(int i =0; i<haystack.length();i++){ 
      if(haystack.charAt(i) == needle.charAt(0)){ 
       if(i+needle.length() <= haystack.length()){ 
       res = haystack.substring(i,i+(needle.length())); 
       if (res.equals(needle)){ 
       pos = i; 
       return pos; 
       } 
     } 
       else{ 
        return -1; 
       } 
      } 
      else{ 
       continue; 
      } 
     } 
     return -1; 

} 
} 
Смежные вопросы