ошибка при реализации функции strstr () - PullRequest
1 голос
/ 31 августа 2010

Я реализовал 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;


}

Ответы [ 6 ]

3 голосов
/ 31 августа 2010

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

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

3 голосов
/ 31 августа 2010

Несколько быстрых советов:

  1. Выделите память для указателей или используйте массивы
  2. Подробнее о арифметике указателей здесь
  3. Прочтите о strstr и подумайте об алгоритме для этого или Google
  4. Подробнее о itoa , в частности, прочитать возвращаемое значение .
1 голос
/ 31 августа 2010

conio.h не является ANSI C

getch не является 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 голосов
/ 04 февраля 2018

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;

}
}
0 голосов
/ 31 августа 2010

Вы проверили первые символы?

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

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

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

Рекурсивный подход для вашей справки:

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 голосов
/ 31 августа 2010
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;}

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...