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

quitと入力しても、プログラムは終了しません。なぜそうなのかしら。

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

4

5 に答える 5

13

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

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

あるいは

strtok(input, "\n");
于 2012-11-18T19:37:08.213 に答える
8

入力の末尾の改行。manfgetsを参照してください。「quit」+改行をテストします。次に例を示します。

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

私は最後の文を完全に逃しました、re char *input。アーキテクチャに応じて、input4バイトまたは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);
于 2012-11-18T19:38:09.573 に答える
0

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

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

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

于 2017-05-31T13:33:31.543 に答える
-1

このソリューションは、標準ライブラリ(stdio.h)のみを必要とし、同じ結果をもたらします。

for (i = 0; input[i] != '\0'; i++); /* getting the string size */
input[i-1] = '\0'; /* removing the newline */
于 2015-05-24T20:31:45.087 に答える
-2

私がしたことは、改行を'\0'nullに置き換えることです。

while(fgets(message,80,stdin))
{
    l=strlen(message)-1;
    if(message[l]='\n') message[l]='\0';
            else message[i+1]='\0';
}
于 2013-07-29T15:07:22.987 に答える