检查给定字符串中是否存在给定子字符串

Check whether a given substring is present in the given string

我应该用 C 编写一个程序来检查给定字符串中是否存在给定子字符串。我写的代码在下面,但它不起作用。谁能告诉我问题出在哪里?

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

int main(void)
{
   char str[30]="the test string";
   char sbstr[30]="test";
   char strcp[30];
   int len = strlen(str);
   int i=0;
   int p=0;

   while(i<len)
   {
       while (str[i] != '[=10=]' && str[i] != ' ')
       {
             strcp[i] = str[i];
              ++i;
       }
       strcp[i] = '[=10=]';

       p = strcmp(sbstr, strcp);

       if (p==0)
       {
           printf("exist");
           break;
       }

       ++i;
   }

}

对于数组strcp

char strcp[30]; 

您需要支持单独的索引。

类似

   int j = 0;
   while (str[i] != '[=11=]' && str[i] != ' ')
   {
         strcp[j++] = str[i++];
   }
   strcp[j] = '[=11=]';

注意有标准的 C 函数 strstr 可用于执行任务。

我知道您已经接受了一个答案,但这里有一种稍微更有效的子字符串比较方法,它不涉及在每次迭代中制作候选子字符串的副本。

char str[30]="the test string";
char sbstr[30]="test";
int len = strlen(str);
int sublen = strlen(sbstr);
int found = 0;
int i = 0;  // starting index in str to start comparing on

while (!found && sublen <= len) {
    found = 1;

    // found = !strncmp(str+i, sbstr, sublen);
    for (int j = 0; j < sublen; j++) {
        if (str[i+j] != sbstr[j]) {
           found = 0;
           break;
        }    
    }

    if (!found) {
        i++;
        len--;
    }
}

if (found) {
    printf("Exists starting at index %d\n", i);
}

如果您真的想要硬核,可以使用 Boyer–Moore string-search algorithm 等众所周知的算法,它可以通过使用 table-查找方案 IIRC 来更快地进行搜索。