C 这个搜索功能看起来好吗?

C 这个搜索功能看起来好吗?,c,string,search,C,String,Search,我是C语言的新手,所以我已经玩了一段时间,并提出了这个搜索函数,我计划将其转换为搜索和替换函数。我确信它是有效的,因为我一直在用大量输入测试它,并且总是得到相应数量的“Word found!”打印 void searchString(){ char message[]=“这是一个测试消息test test”; char wordToFind[]=“消息”; int i=0; 对于(i=0;i没有用魔法找到长度。它必须扫描每个字符以找到尾随的null。这是一个O(n)算法。如果迭代每个字符并调用s

我是C语言的新手,所以我已经玩了一段时间,并提出了这个搜索函数,我计划将其转换为搜索和替换函数。我确信它是有效的,因为我一直在用大量输入测试它,并且总是得到相应数量的“Word found!”打印

void searchString(){
char message[]=“这是一个测试消息test test”;
char wordToFind[]=“消息”;
int i=0;
对于(i=0;i

我的问题是,这是有效的还是有更好的方法在C中实现这一点?

函数中存在多个问题:

  • 当检测到不匹配时,您会将
    i
    增加两次,因此在
    中找不到
    消息
    ,这是一个测试消息测试
  • 您需要对字符串长度进行硬编码。使用
    sizeof()
    只能用于编译时已知的字符串,因此您的函数根本不是泛型函数。相反,您应该编写一个函数,该函数使用2个指向C字符串的指针,并谨慎地使用
    strlen()
    ,或者检查循环中的空终止符
以下是一个更通用的修改版本:

void searchString(const char *message, const char *wordToFind) {

    int i = 0;
    for (i = 0; message[i] != '\0'; i++) {
        if (message[i] == wordToFind[0]) {
            int i2 = 0;
            for (i2 = 1; wordToFind[i2] != '\0'; i2++) {
                if (message[i + i2] != wordToFind[i2]) {
                    break;
                }
            }
            if (wordToFind[i2] == '\0') {
                printf("Word found at offset %d\n", i);
            }
        }
    }
}
注:

  • 函数不处理空
    wordToFind[]
    的特殊情况
  • 就效率而言,使用标准库函数
    strstr()
    可能会更有效,因为它可能以非常高效的方式实现
下面是一个使用
strstr()
的替代方法:


第一印象是压痕的层次太多了。根据经验,如果有三个以上,请重写代码。还要注意的是,如果传递一个指针,
sizeof
将给出令人惊讶的结果。我想你的意思是斯特伦。谢谢,我看着它,也在想同样的事情。我觉得我可以找到一种方法来消除第二个for循环。啊,读一下strlen(),这看起来更像是我想用的东西。这是行不通的,因为你要将
I
的值增加两次,假设
message
的值等于
“mmessage”和 WordFoFunt等于“消息”,然后该代码输出错误的答案。如果你想更好地搜索子串,那么考虑一个完全不同的算法,就像它值得指出的,<>代码> StLLIN < /Cord>没有用魔法找到长度。它必须扫描每个字符以找到尾随的null。这是一个O(n)算法。如果迭代每个字符并调用
strlen()
每次迭代,那么就得到了一个O(n^2)算法。chqrlie通过检查尾部null所做的工作要好得多。如果n和m是message和wordToFind的长度,那么他的代码是O(nm),而使用strlen()每次迭代都是O(n^2m^2)。(除非编译器足够聪明,可以将strlen()优化为循环不变量)。@TrentP:我修改了关于使用
strlen()
的答案。请注意,如果
单词tofind
具有与
消息的大部分匹配的长前缀,则复杂性的最坏情况为O(n.m),但平均情况仅略大于O(n)。
void searchString(const char *message, const char *wordToFind) {

    int i = 0;
    for (i = 0; message[i] != '\0'; i++) {
        if (message[i] == wordToFind[0]) {
            int i2 = 0;
            for (i2 = 1; wordToFind[i2] != '\0'; i2++) {
                if (message[i + i2] != wordToFind[i2]) {
                    break;
                }
            }
            if (wordToFind[i2] == '\0') {
                printf("Word found at offset %d\n", i);
            }
        }
    }
}
void searchString(const char *message, const char *wordToFind) {
    for (const char *p = message; (p = strstr(p, wordToFind)) != NULL; p++) {
        printf("Word found at offset %d\n", (int)(p - message));
        if (*p == '\0') { /* handle special case of empty wordToFind */
            break;
        }
    }
}