实现strstr()函数时出错

时间:2010-08-31 07:04:05

标签: c

我已经实现了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 个答案:

答案 0 :(得分:3)

一些快速提示:

  1. memory分配给指针或使用arrays
  2. 详情阅读pointer arithmetic
  3. 阅读strstr并考虑一种算法或google
  4. 有关itoa的更多信息,请特别阅读return value

答案 1 :(得分:3)

对于初学者,您可能想要了解“获取”的工作方式: http://en.wikipedia.org/wiki/Gets

您只是在main方法中声明堆栈上的指针。这些指针可能指向一些随机内存。如上面的注释所述,您必须使用'malloc'(s1 = malloc(256);)在堆上分配内存,或者使用f.ex在堆栈上分配内存。 “char s1[256];”等然后将地址传递给它以获取“gets(&s1);”而不是

答案 2 :(得分:1)

conio.h不是ANSI C

getch不是ANSI C

itoa不是ANSI C

您的函数返回一个字符串,其中包含s2中的positionnumber。这适合你吗?

必须释放回报。

您知道阵列访问吗?优于*(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缺少休息时间,请参阅其他答案。

答案 3 :(得分: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;}

 }

答案 4 :(得分:0)

您是否检查过第一个字符?

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;
}

答案 5 :(得分:0)

实现strstr()

的Java代码
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;

}
}