1

我已经坚持了很长时间,我只是想不出解决这个问题的方法。所以,我有一个包含术语列表的数组,每个术语都将与输入文件进行比较,然后如果匹配,就会有一个输出显示“找到匹配”......我遇到的一个问题是strncasecmp 仅比较该行的前 n 个字符。这意味着我每次都必须将数组向左移动,直到我到达终点。

这是我到目前为止想出的......

while (fgets(line, 256, ifp) != NULL){ 
    for (i = 0; i < numberTerms; i++){
        len = strlen(term[i]);
        for (lineStep = 0; lineStep < (strlen(line) - 1); lineStep++){
            if (line[lineStep] == '\0')
                break;
            if (strncasecmp(line, term[i], len) == 0)
               printf("Match found!\n");
            for (j = 0; j < (strlen(line)-1); j++)
                line[lineStep] = line[lineStep + 1];
        }
    }
}

这只会打印“找到匹配!” 一次而不是它需要的 5 次。我究竟做错了什么?另外,如果有更简单的方法来搜索字符串,请告诉我。

4

1 回答 1

1

您可以使用函数strsstr在另一个字符串中查找子字符串。

这是一个示例用法:

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

int main(int argc, char** argv)  
{ 
    char* str = "hello foo world fOo this is foo a test foo strstr";
    char* p;
    int offset = 0, len = strlen("foo");
    while((p = strstr(str+offset, "foo"))) {
        printf("Match found at offset: %d\n", (p-str));
        offset = (p-str) + len;
    }
    return 0;  
} 

上面的代码打印:

Match found at offset: 6
Match found at offset: 28
Match found at offset: 39

还有一个用于不区分大小写的函数strcasestr ,但它不是标准的。为了使您的代码可移植,您可以编写一个函数,将两个字符串都转换为小写,然后使用strstr执行搜索。

编辑

这是一个将字符串转换为小写的基本函数,返回的字符串需要被释放!

#include <ctype.h>

char* strtolower(char* str)
{
    char* strlower = NULL, *p;
    if(str) {
        p = strlower = strdup(str);
        while(*p) {
            *p = tolower(*p);
            p++;
        }
    }
    return strlower;
}

与上面的字符串和子字符串一起使用,它还应该打印:

Match found at offset: 16
于 2013-11-04T00:04:51.087 回答