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

时间:2013-07-24 15:43:34

标签: 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))
     {
       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();
 }

str1中多次出现str2起始字符时无法正常工作,否则效果正常。 如何优化它以使其在所有情况下都能正常工作?

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

试试这个:

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");

答案 2 :(得分:0)

我同意你应该表明你做了什么。请下次再这样做。

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

#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();
} 

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

对语法很抱歉,我只有c#可用。你必须使用strlen(string)作为长度,'%d'作为'{0}',printf作为Console.Writeline(“”);

答案 4 :(得分:0)

#include <string.h>

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

请查看strstr函数的文档。

答案 5 :(得分:-1)

//Declaration: char *strstr(const char *str1, const char *str2);
//Return: It returns a null pointer if no match is found.

#include <string.h>
#include <stdio.h>

int main(void)
{
char *p;

p = strstr("goa", "gogoa");
printf(p);

return 0;
}