C 在一行中搜索一个术语

C 在一行中搜索一个术语,c,arrays,string,search,C,Arrays,String,Search,我已经在这个问题上纠缠了很久,我就是想不出一个办法来解决这个问题。 因此,我有一个数组,它有一个术语列表,每个术语将与一个输入文件进行比较,然后如果有匹配项,将有一个输出,显示“找到匹配项”。。。 我遇到的一个问题是strncasecmp只比较行的前n个字符。这意味着每次我都必须向左移动数组,直到到达末尾 这就是我到目前为止想到的 while (fgets(line, 256, ifp) != NULL){ for (i = 0; i < numberTerms; i++){

我已经在这个问题上纠缠了很久,我就是想不出一个办法来解决这个问题。 因此,我有一个数组,它有一个术语列表,每个术语将与一个输入文件进行比较,然后如果有匹配项,将有一个输出,显示“找到匹配项”。。。 我遇到的一个问题是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];
        }
    }
}
while(fgets(第256行,ifp)!=NULL){
对于(i=0;i

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

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

下面是一个示例用法:

#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;  
} 
还有一个用于区分大小写的函数,但它不是标准函数。为了使代码可移植,您可以编写一个函数,将两个字符串转换为小写,然后使用执行搜索

编辑

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

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

可以使用该函数查找另一个字符串中的子字符串

下面是一个示例用法:

#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;  
} 
还有一个用于区分大小写的函数,但它不是标准函数。为了使代码可移植,您可以编写一个函数,将两个字符串转换为小写,然后使用执行搜索

编辑

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

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

我无法理解您的问题,除非您发布信息以便我可以重现您的结果。
strncasecmp()
如果您将整行传递给它,则只会比较该行的第一个
n
字符。如果您不是将类似于
&line[i]
的内容传递给它,而不是
line
,您就不会有这种行为。除非您发布信息,以便我可以重现您的结果,否则我无法理解您的问题。
strncasecmp()
如果将整行传递给该行,则只会比较该行的第一个
n
字符。如果将类似于
&line[i]
的内容传递给它,而不是
line
,则不会得到该行为。