我多年来一直坚持这个,我只是想不出办法来解决这个问题。 所以,我有一个包含术语列表的数组,每个术语将与输入文件进行比较,然后如果匹配,则会有一个输出显示“匹配找到”... 我遇到的一个问题是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次。我究竟做错了什么?另外,如果有更简单的方法来搜索字符串,请告诉我。
答案 0 :(得分: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