2

私はCプログラミングが初めてです。簡単な入力を受け取るプログラムを作成しようとしています。ただし、入力文字列をユーザーが入力する「意味」と比較すると、最後に追加の文字があることがわかりました。これは '\0' か '\r' ではないかと思いましたが、そうではないようです。これは私のコードスニペットです:

char* getUserInput(char* command, char $MYPATH[])
{
    printf("myshell$ ");
    fgets(command, 200, stdin);
    printf("%u\n", (unsigned)strlen(command));

    if ((command[(unsigned)strlen(command) - 1] == '\0') || (command[(unsigned)strlen(command) - 1] == '\r'))
    {
        printf("bye\n");
    }

return command;
}

コードは、入るときに「exit」と言うと、5文字が入力されたことを示しています。しかし、私はこの最後のものの正体を理解できないようです. 「さようなら」は印刷されません。この謎のキャラクターが何であるか知っている人はいますか?

4

3 に答える 3

2

仮定

  1. c の配列インデックスは 0 から始まります
  2. strlen は文字列の長さを返します

したがって、 string がある場合"exit"、これは array = の 5 つのシンボルになりe, x, i, t, \0、strlen は 4 を返しますが、それを 1 減分しようとしているので、NULL ターミネータの代わりに string の最後のシンボルをチェックしています。

NULLターミネータの使用を確認するにはcommand[strlen(command)]-これは\0常にあなたに与えるので、意味がありません

文字列を比較したい場合は、strcmp関数を使用します

更新:プログラムの問題は、fgets\nが文字列の最後にシンボルを追加するためです:

改行文字は fgets の読み取りを停止させますが、関数によって有効な文字と見なされ、str にコピーされる文字列に含まれます。

于 2013-10-15T06:15:59.933 に答える
0

最後の文字が表示されない理由はstrlen()、文字列の長さに '\0' が計算されないためです。したがって、'\0' のテストは成功しません。たとえば、 3const char* a = "abc";strlen(a)なります。テストしたい場合は、次の方法でアクセスする必要があります。command[strlen(command)]

strlen「終了」時に 5 に等しくなる理由fgetsは、入力の最後に「\n」文字が追加されるためです。あなたはそれをテストすることができますcommand[strlen(command) -1 ] == '\n'

于 2013-10-15T06:13:27.757 に答える