阅读char的更好方法是什么?

时间:2010-10-21 19:20:34

标签: c

我写了一些代码来简单地从键盘上读取一个字符但程序失败了,为什么?我怎么读一个炭?

int main(int argc, char** argv)
{
 char op;

 do
 {
  printf("¿Sigues?");
  scanf("%c",&op);
 }while(op=='s' || op=='S');
 return 0;
}

4 个答案:

答案 0 :(得分:2)

您的问题是%c转换说明符不会导致scanf()跳过前导空格。在阅读输入后,您需要处理仍在流中的换行符。

第一次通过循环调用scanf()时输入流为空,因此等待您输入内容。您键入s并按Enter键,因此输入流包含字符s\n(换行符)。 scanf()从输入流中删除s并将其分配给op。当第二次调用scanf()时,输入流为空;它仍然包含\n字符,因此scanf()读取它并将其分配给op,这会导致循环条件失败,因此循环退出。

有几种方法可以解决这个问题。我将建议使用fgets()阅读字符串而不是单个字符,如下所示:

char op[3] = {0}; // input character + newline character + 0 terminator

do
{
  printf("¿Sigues?");
  if (fgets(op, sizeof op, stdin))
  {
    /**
     * Check for a newline character in the input.  If it's not there
     * then the user typed in too many characters.  In order to keep
     * the input stream from getting clogged up with bad input, read
     * until we find a newline character.
     */
    char tmp[3];
    char *newline = strchr(op, '\n');
    while (!newline && fgets(tmp, sizeof tmp, stdin))
    {
      newline = strchr(tmp, '\n');
    }
  }
  else
  {
    printf("Error while reading input\n");
    op[0] = 0;
  }
} while (tolower(op[0]) == 's');

答案 1 :(得分:1)

op = getc(stdin);

答案 2 :(得分:1)

scanf只在读取换行符后才会刷新。它不能以平台无关的方式完成

答案 3 :(得分:0)

你看到两次“Sigues”这一行,因为输入流中还有一个\n。如果您输入一个字符并按Enter键,则输入流中现在有两个字符。您的scanf格式化程序只指定一个char,因此scanf读入一个char然后前进。但是,流中的下一个字符是\n,因此在第二个字符中退出循环。

NB。 @ eduffy的getc(stdin)技术会做同样的事情,stdin中仍有\n。你需要以某种方式超越\n

如何读取您的char,然后将流的其余部分扼杀到\n char?我试过这个,它对我有用:

char op;

do
 {
  printf("¿Sigues?");
  scanf("%c",&op);
  while(getchar() != '\n') continue;
}while(op=='s'|| op=='S');