C 实现strstr()函数时出错

C 实现strstr()函数时出错,c,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

我已经实现了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;


}
#包括
#包括
#包括
#包括
char*mystrstrstr(char*,char*);
int main()
{
字符*s1,*s2,*标志;
printf(“输入字符串:\n”);
获取(s1);
printf(“输入要在其中查找的单词:\n”);
获取(s2);
flag=mystrstrstr(s1,s2);
国际单项体育联合会(旗)
printf(“找到单词”);
其他的
printf(“未找到单词”);
getch();
返回0;
}
char*mystrstr(char*s1,char*s2)
{int flag=0,j,i;
字符*温度;
对于(i=0;i一些快速提示:

  • 分配给指针或使用
  • 阅读更多关于这里
  • 阅读并思考这样做的算法或谷歌
  • 更多信息,请具体阅读
  • 一些快速提示:

  • 分配给指针或使用
  • 阅读更多关于这里
  • 阅读并思考这样做的算法或谷歌
  • 更多信息,请具体阅读

  • for(i=0;i
    for(i=0;i对于初学者,您可能想了解“get”是如何工作的:
    


    您只是在主方法的堆栈上声明指针。这些指针可能会指向一些随机内存。正如上面的注释所述,您必须使用“malloc”(
    s1=malloc(256);
    )在堆上或使用f.ex在堆栈上分配内存。
    char s1[256]
    ”等,然后使用“
    get(&s1)”将地址传递给get;
    ”相反,对于初学者,您可能想了解“get”的工作原理:

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

    getch不是ansic

    itoa不是ANSI C

    您的函数返回一个字符串,该字符串包含s2中的positionnumber。是否适合您

    返回必须被释放

    你知道数组访问吗?比
    *(s2+j)
    更好的是
    s2[j]

    if(*(s1+1)==s2[0])
    是否应该是
    if(*(s1+i)==s2[0])

    (j=1;*s2;j++)的
    是否应该是(j=1;s2[j];j++)的

    如果
    flag=0
    缺少中断,请参阅其他答案。

    conio.h不是ANSI C

    getch不是ansic

    itoa不是ANSI C

    您的函数返回一个字符串,该字符串包含s2中的positionnumber。是否适合您

    返回必须被释放

    你知道数组访问吗?比
    *(s2+j)
    更好的是
    s2[j]

    if(*(s1+1)==s2[0])
    是否应该是
    if(*(s1+i)==s2[0])

    (j=1;*s2;j++)的
    是否应该是(j=1;s2[j];j++)的


    如果
    flag=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;
    }
    

    你检查了第一个字符了吗

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

    实现strstr()的Java代码

    类解决方案{
    公共int strStr(串草垛、串针){
    字符串res=“”;
    int pos=0;
    如果(针长度()==0){
    返回0;
    }
    如果(干草堆等于(针)){
    返回0;
    }
    如果(针.length()>haystack.length()| | haystack.length()==0){
    返回-1;
    }
    
    for(inti=0;iJava代码来实现strstrstr()

    类解决方案{
    公共int strStr(串草垛、串针){
    字符串res=“”;
    int pos=0;
    如果(针长度()==0){
    返回0;
    }
    如果(干草堆等于(针)){
    返回0;
    }
    如果(针.length()>haystack.length()| | haystack.length()==0){
    返回-1;
    }
    

    对于It i=0;你面临的问题是什么?它不是按你想要的方式工作吗?非常糟糕的代码,考虑学习。你写的不是斯特拉斯,而是我的意图。把问题分解成步骤。我认为你是一个函数,但是你从代码中声明程序中的函数,看起来你在寻找S中的子串S1。TrsS2然后我不认为你的内部循环逻辑是正确的。你面临什么问题?它不是按你想要的方式工作吗?非常糟糕的代码,考虑学习。你写的不是斯特拉斯,而是我的意图。把问题分解成步骤。我认为你是一个函数,但是你从代码中声明程序中的函数。看起来您试图在字符串s2中查找子字符串s1,但我认为您的内部循环逻辑不正确。如果我因为不太了解c而做错了什么,请纠正我。如果我因为不太了解c而做错了什么,请纠正我。我的意思是您必须使用gets(&s1);如果您使用“char s1[256]”在堆栈上分配内存。使用指针和malloc时不是这样,那么您是正确的否。这与堆栈与malloced内存无关。如果是char foo[32],则get(&foo);是错误的;如果是char*foo=malloc(32),则是错误的;抱歉!您是正确的。我猜您必须编写get(&s1[0])如果你想要一个类似的效果=),我的意思是,如果你在堆栈上用“char s1[256]”分配内存,你就必须使用get(&s1);如果你在使用指针和malloc时不这样做,那么你是正确的否。这与堆栈与malloced内存无关。get(&foo);如果是char foo[32],那么它是错误的;如果是char*foo=malloc,那么它是错误的(32);很抱歉!你说得对。我想你得写封信了