9

2 つの文字列を比較しようとしています。1 つはファイルに保存され、もう 1 つはユーザー (stdin) から取得されます。

サンプルプログラムは次のとおりです。

int main()
{
    char targetName[50];
    fgets(targetName,50,stdin);

    char aName[] = "bob";
    printf("%d",strcmp(aName,targetName));

    return 0;
}

このプログラムでstrcmpは、入力が の場合、 は値 -1 を返します"bob"。どうしてこれなの?平等であるべきだと思いました。どうすればそうなるのですか?

4

6 に答える 6

12

strcmptrue と false の逆の結果を持つ数少ない関数の 1 つです...文字列が等しい場合、結果は 1 ではなく 0 になります....

if (strcmp(a, b)) {
    /* Do something here as the strings are not equal */
} else {
    /* Strings are equal */
}

といえばfgets、文字列の末尾に改行がついている可能性があります...それを取り除く必要があります...

+-+-+-+--+--+
|b|o|b|\n|\0|
+-+-+-+--+--+

改行を取り除くには、これを行います。注意: "strlen(aName) - 1" は使用しないでください。fgets によって返される行が NUL 文字で始まる可能性があるためです。したがって、バッファーへのインデックスは -1 になります。

aName[strcspn(aName, "\n")] = '\0';

+-+-+-+--+
|b|o|b|\0|
+-+-+-+--+

今、strcmp0を返す必要があります...

于 2010-03-08T21:21:43.400 に答える
7

fgets改行が表示されるまで読み取り、その後戻るため、コンソールで bob と入力すると、targetName「bob」と一致しない「bob\n」が含まれます。fgets のドキュメントから: (太字を追加)

stream から文字を読み取り、(num-1) 文字が読み取られるか、改行またはファイルの終わりのいずれか早い方に到達するまで、それらを C 文字列として str に格納します。 改行文字は fgets の読み取りを停止させますが、有効な文字と見なされるため、str にコピーされる文字列に含まれます。 C 文字列の終わりを示すために、読み込んだ文字の後に null 文字が str に自動的に追加されます。

比較する前に、targetName の末尾から改行を削除する必要があります。

int cch = strlen(targetName);
if (cch > 1 && targetName[cch-1] == '\n')
   targetName[cch-1] = '\0';

または、テスト文字列に改行を追加します。

char targetName[50];
fgets(targetName,50,stdin);

char aName[] = "bob\n";
printf("%d",strcmp(aName,targetName));
于 2010-03-08T21:20:44.050 に答える
3

fgets は、\nEnter キーを押したときにユーザーから引き込む文字列に a を追加しています。比較しようとしている文字列の末尾を使用するstrcspnか、末尾に追加するだけで、これを回避できます。\n

printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
temp[strcspn(temp, "\n")] = '\0';
if(strcmp(temp, "ls") == 0 || strcmp(temp, "exit") == 0)

\nこれはをに置き換えるだけ\0ですが、怠惰になりたい場合は、次のようにすることができます。

printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
if(strcmp(temp, "ls\n") == 0 || strcmp(temp, "exit\n") == 0)

しかし、それほどエレガントではありません。

于 2012-08-30T15:54:54.640 に答える
2

fgets が変数に改行文字を埋め込んでいるためですtargetName。これは比較を放棄しています。

于 2010-03-08T21:17:51.300 に答える
1

fgets文字列に改行を追加するため、最終的にbob\n\0which is not same となりbob\0ます。

于 2010-03-08T21:18:12.883 に答える
1

ほとんどの場合、UNIX ライク システムでの入力 "\n" の行末文字が原因です。

于 2010-03-08T21:19:45.027 に答える