1

私は何年もこれに固執してきましたが、この問題を解決する方法が思いつきません。したがって、用語のリストを含む配列があり、各用語は入力ファイルと比較され、一致する場合は「一致が見つかりました」という出力が表示されます...私が抱えている問題の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];
        }
    }
}

これは「Match found!」のみを出力します。必要な 5 回ではなく 1 回です。私は何を間違っていますか?また、文字列を簡単に検索する方法があれば教えてください。

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 に答える