0

これは私のコードです:

        if(strcmp(pch,map[i].name)==0){
            printf("Equal\n");
            return 0;
        }

pchファイルから読み取られ、map[i].name既知のサイズは 64 です。これは、64 より小さい文字列に最適です。サイズが 63 未満のこれら 2 つの文字列を比較すると、次のようになります。

file11111111111111111111111111111111111111111111111111111111111

file11111111111111111111111111111111111111111111111111111111111

すべてが桃色で、期待どおりの結果は同じですが、これら 2 つ (サイズ 64) を比較すると、次のようになります。

file111111111111111111111111111111111111111111111111111111111111

file111111111111111111111111111111111111111111111111111111111111

戻り値は false です。私はやろうと思った:

        if(strncmp(pch,map[i].name,64)==0){
            printf("Equal\n");
            return 0;
        }

正確なサイズが 64 の文字列では機能しますが、それよりも小さい文字列の場合、結果はランダムになります。ここで私はどのような奇抜さを扱っていますか?

編集:これは完全なコードです:

    char * pch;
    char tempFilesNeeded[100*64+100];
    strcpy(tempFilesNeeded,map[i].filesNeeded);
    pch = strtok(tempFilesNeeded,",");
    while (pch != NULL)
    {
        if(strcmp(pch,map[i].name)==0){
            printf("Equal\n");
            return 0;
        }

        pch = strtok (NULL, ",");
    }
4

2 に答える 2

9

そうだったら

char pch[64];

終了には最後のエントリが必要なため、そこに 64 の可視文字を含めることはできません。"file111111111111111111111111111111111111111111111111111111111111"その配列にある場合、それは終了せず、それstrcmp()を呼び出すと未定義の動作が呼び出されます。

また、マイナーな点として、その戻り値はブール値ではないstrcmp()ため、「false」を返すと言うのは間違っています。最初の 2 つの異なる文字間の関係を返します。どの文字も異なる文字列が等しい場合は、0 を返します。

于 2012-11-14T13:58:54.530 に答える
5

配列の 1 つまたは両方の正確なサイズが 64 の場合、文字列の最後の '\0' がありません。

于 2012-11-14T13:58:42.457 に答える