这个搜索功能看起来有什么好处吗?

时间:2017-01-22 16:59:32

标签: c string search

我是C的新手,所以我一直在玩它,并提出了这个搜索功能,我计划进入搜索和替换功能。我确信它有效,因为我一直在用一堆输入进行测试,总是得到相应数量的“找到的单词!”打印。

void searchString() {
    char message[] = "This is a test message test test";
    char wordToFind[] = "message";

    int i = 0;
    for (i = 0; i < sizeof(message) - 1; i++) {
        if (message[i] == wordToFind[0]) {
            int i2 = 0;
            for (i2 = 1; i2 < sizeof(wordToFind) - 1; i2++) {
                if (message[i + i2] != wordToFind[i2]) {
                    i++;
                    break;
                }
                if (i2 == sizeof(wordToFind) - 2) {
                    printf("Word found!\n");
                    break;
                }
            }
        }
    }
}

我的问题是,这有效还是有更好的方法在C中执行此操作?

1 个答案:

答案 0 :(得分:1)

您的功能存在多个问题:

  • 当您检测到不匹配时,会增加i两次,因此您在message中找不到This is a test mmessage test test
  • 您需要对字符串长度进行硬编码。使用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()的替代方案:

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