使用c在另一个字符串中查找一个字符串

使用c在另一个字符串中查找一个字符串,c,algorithm,C,Algorithm,我编写了以下代码,以查找str1是否存在于str2中。但并不是所有情况下都适用 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int i,j,flag=1; char str1[]="goa",str2[]="gogoa"; if (strlen(str1)>strlen(str2)) {

我编写了以下代码,以查找
str1
是否存在于
str2
中。但并不是所有情况下都适用

  #include<stdio.h>
  #include<stdlib.h>
  #include<string.h>
  int main()
   {
     int i,j,flag=1;
     char str1[]="goa",str2[]="gogoa";
     if (strlen(str1)>strlen(str2))
     {
       printf("not found");
       return;
     }
    for ( i = 0; str2[i]; i++)
    {
      if (str1[0]==str2[i])
      {
        for ( j = 0; str1[j]; j++)
        {
          if (str1[j]!=str2[i+j])
          {
            printf("not found");
            flag=0;
          }
        }
        break;
      }
    }
    if (flag==1)
    {
      printf("found at index %d ",i);
    }
    getchar();
 }
#包括
#包括
#包括
int main()
{
int i,j,flag=1;
字符str1[]=“goa”,str2[]=“gogoa”;
如果(strlen(str1)>strlen(str2))
{
printf(“未找到”);
返回;
}
对于(i=0;str2[i];i++)
{
if(str1[0]==str2[i])
{
对于(j=0;str1[j];j++)
{
if(str1[j]!=str2[i+j])
{
printf(“未找到”);
flag=0;
}
}
打破
}
}
如果(标志==1)
{
printf(“在索引%d处找到”,i);
}
getchar();
}
str1
起始字符在
str2
中多次出现时,它不工作,否则它工作正常。 我如何优化它以使其在所有情况下都能工作?

尝试以下方法:

int i,j,flag=0, match=0;
char str1[]="goa",str2[]="gogoa";
if (strlen(str1)>strlen(str2))
{
    printf("not found");
    return;
}
for ( i = 0; str2[i]; i++)
{
    if (str1[0]==str2[i])
    {
        match=1;
        for ( j = 0; str1[j]; j++)
        {
            if (str1[j]!=str2[i+j])
                match=0;
        }
        if(match == 1)
        {
            flag = 1;
            break;
        }
    }
}
if (flag==1)
    printf("found at index %d ",i);
else
    printf("not found");
//声明:char*strstrstr(const char*str1,const char*str2);
//Return:如果找不到匹配项,则返回空指针。
#包括
#包括
内部主(空)
{
char*p;
p=strstr(“goa”、“gogoa”);
printf(p);
返回0;
}

我同意关于你应该展示你所做的事情的评论。请下次再做

现在,我想建议两种方法来调试出棘手的问题:使用printfs并理解流程或使用gdb。我已经评论了你的程序w.r.t.的printf方法。还没有测试所有的案例…但这应该能给你一个调试的方向。希望能有帮助。下次发布问题之前,请记住执行此步骤:-)

#包括
#包括
#包括
main()
{
int i,j,flag=1;
字符str1[]=“goa”,str2[]=“gogoa”;
如果(strlen(str1)>strlen(str2)){
printf(“未找到”);
返回;
}
对于(i=0;str2[i];i++){
/*如果起始字母不匹配,请忘记它*/
if(str1[0]==str2[i]){
flag=1;
//通过str1进行迭代
对于(j=0;str1[j];j++){
if(str1[j]!=str2[i+j]){
printf(“%s未在%s的索引%d处找到,\n”,str1,i,str2);
flag=0;
break;//超出内部for循环
}
}
如果(j==strlen(str1)){
//找到了整个字符串。
中断;//外部for循环中断
}
}
}
如果(标志==1){
printf(“%s在%s的索引%d处找到,\n”,str1,i,str2);
}
getchar();
} 
#包括
#包括
#包括
int main(){
int i,j,flag=0,len1,len2;
字符str1[]=“goa”,str2[]=“gogoa”;
len1=strlen(str1);
len2=strlen(str2);
如果(len1>len2){
printf(“未找到”);
返回0;
}

对于(i=0;i我已经重写了代码,只做了一些轻微的修改,它对我有效, 检查所有必要的情况,并让我知道

    public static bool findString(string searchText, string fullText)
    {
        bool result = false;
        if (searchText.Length > fullText.Length)
        {
            return false;
        }
        for (int i = 0; i <= (fullText.Length - searchText.Length); i++)
        {
            if (searchText[0] == fullText[i])
            {
                for (int j=0; j<searchText.Length ;j++)
                {

                    if ((i+j)< fullText.Length && searchText[j] == fullText[i+j])
                        result = true;
                    else
                    {
                        result = false;
                        break;
                    }
                }
            }
            if (result)
            {
                Console.WriteLine("found at index {0}", i);
                break;
            }
        }
            return result;
    }
publicstaticboolfindstring(stringsearchtext,stringfulltext)
{
布尔结果=假;
if(searchText.Length>fullText.Length)
{
返回false;
}
对于(int i=0;i
#包括
if(strstr(str2,str1)!=NULL){
/* ... */
}

请签出函数文档。

请搜索堆栈溢出,这个问题已经被问过很多次了…使用strstrstr库函数而不是编写自己的函数。您可以使用
strstrstr
使其工作不是一个“优化”,而是一个修复方法!另外,请向我们展示您为找到问题所在所做的努力。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
  int i,j,flag=1;
  char str1[]="goa",str2[]="gogoa";

  if (strlen(str1)>strlen(str2)) {
        printf("not found");
        return;
  }

  for ( i = 0; str2[i]; i++) {
        /* If starting letter does not match, forget it */
        if (str1[0]==str2[i]) {
                flag = 1;
                // Iterate thro' str1
                for ( j = 0; str1[j]; j++) {
                        if (str1[j] != str2[i+j]) {
                                printf("%s not found at index %d of %s\n", str1, i, str2);
                                flag=0;
                                break;  // out of inner for loop
                        }
                }
                if (j == strlen(str1)) {
                        // found the entire string.
                        break;  // out of outer for loop
                }
        }
  }
  if (flag==1) {
        printf("%s found at index %d of %s\n", str1, i, str2);
  }
  getchar();
} 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
    int i, j, flag=0, len1, len2;
    char str1[]="goa",str2[]="gogoa";
    len1 = strlen(str1);
    len2 = strlen(str2);
    if (len1 > len2){
        printf("not found");
        return 0;
    }
    for (i = 0; i <= len2 - len1; ++i){
        if (str1[0]==str2[i]){
            flag = 1;
            for (j = 1; str1[j]; ++j){
                if (str1[j]!=str2[i+j]){
                    flag=0;
                    break;
                }
            }
            if(flag==1)
                break;
        }
    }
    if (flag==1){
        printf("found at index %d ",i);
    } else {
        printf("not found");
    }
    return 0;
}
    public static bool findString(string searchText, string fullText)
    {
        bool result = false;
        if (searchText.Length > fullText.Length)
        {
            return false;
        }
        for (int i = 0; i <= (fullText.Length - searchText.Length); i++)
        {
            if (searchText[0] == fullText[i])
            {
                for (int j=0; j<searchText.Length ;j++)
                {

                    if ((i+j)< fullText.Length && searchText[j] == fullText[i+j])
                        result = true;
                    else
                    {
                        result = false;
                        break;
                    }
                }
            }
            if (result)
            {
                Console.WriteLine("found at index {0}", i);
                break;
            }
        }
            return result;
    }
#include <string.h>

if(strstr(str2, str1) != NULL) {
    /* ... */
}