web-dev-qa-db-ja.com

fgets()の最後に改行が含まれています

fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}

Quitと入力しても、プログラムは終了しません。なぜそうなのか疑問に思います。

ちなみに、inputchar *input;として宣言されています。

9
Man Person

入力の末尾の改行。 man fgets を参照してください。 「quit」+改行をテストします。例:

fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
    exit(-1);
}

私は最後の文を完全に逃しました、re char *input。アーキテクチャに応じて、inputの長さは4バイトまたは8バイトになります。したがって、コードは効果的に

fgets(input, 8, stdin);

これはメモリの実際のサイズを反映していません。inputはを指します。これは、入力が8バイトより短い限り「機能」する可能性がありますが、入力が大きい場合は切り捨てられます。さらに、次にfgetsを呼び出すときに、残りの入力を取得します。

実際のサイズを指定するか、@ JonathanLefflerのアドバイスを受けて、代わりにchar配列を宣言する必要があります。

char input[64];
fgets(input, sizeof(input), stdin);

または

char *input = malloc(N);
fgets(input, N, stdin);
8
Olaf Dietsche

関数fgetsは、読み取られた文字列の最後に改行を追加する場合があります。次のことを確認する必要があります。

size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
    input[ln] = '\0';

あるいは

strtok(input, "\n");
13
codaddict

これを次のようにコーディングすることをお勧めします。

if(strstr(input, "quit") != NULL){

理由:これにより、余分な文字(テキストの前後のスペースなど)を追加する人々の問題が解決されます。