4

私は現在getc()、ユーザーからの入力を受け取るためにループで使用しています:

char x;
while (x != 'q')
{    
 printf("(c)ontinue or (q)uit?");
 x = getc(stdin);
}

ユーザーcがループの実行に入ると、おそらく最初の入力として追加の文字 (ターミネーターまたはおそらく改行だと思いますか?) を取得します。

次のようなものを使用してこれを防ぐことができます。

char toss;
char x;
while (x != 'q')
{    
 printf("(c)ontinue or (q)uit?");
 x = getc(stdin);
 toss = getc(stdin);
}

しかし、これは怠惰な初心者の扱い方だと思います。これを行うためのよりクリーンな方法はありますか、getcそれとも文字列として使用し、配列の最初の文字を使用する必要がありますか? 私が考えたことのない別のよりクリーンな方法はありますか?

4

2 に答える 2

4

または、それを文字列として使用し、配列の最初の文字を使用する必要がありますか?

丁度。

char buf[32] = { 0 };

while (buf[0] != 'q') {
    fgets(buf, sizeof(buf), stdin);
    /* do stuff here */
}
于 2013-03-01T21:48:03.330 に答える
3

スペースを無視することもできます:

int x = 0;
while (x != 'q' && x != EOF)
{    
 printf("(c)ontinue or (q)uit?");
 while ((x = getc(stdin)) != EOF && isspace(x)) { /* ignore whitespace */ }
}

また、ではなくをgetc()返すことに注意してください。これは、無限ループを回避するためにチェックする必要があるものを検出する場合に重要です(たとえば、ユーザーが unix システムで Ctrl-D を押した場合、または Windows で Ctrl-Z を押した場合)。使用するには、ctype.h を含める必要があります。intcharEOFisspace()

于 2013-03-01T21:51:33.763 に答える