首页 文章

scanf()将新行char留在缓冲区中

提问于
浏览
53

我有以下程序:

int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");

  return 0;
}

正如我在C书中读到的那样,作者说 scanf() 在缓冲区中留下了一个新行字符,因此,程序不会在第4行停止供用户输入数据,而是将新行字符存储在c2中并移动到第5行 .

是对的吗?

但是,这只发生在 char 数据类型中吗?因为我没有在第1,2,3行中看到 int 数据类型的这个问题 . 是不是?

3 回答

  • 48

    scanf()函数在尝试解析字符以外的转换之前会自动删除空格 . 字符格式(主要是 %c ;也是扫描集 %[…] - 和 %n )是例外;他们不删除空格 .

    使用带有前导空格的 " %c" 可跳过可选空格 . 不要在 scanf() 格式字符串中使用尾随空白 .

    请注意,这仍然不会消耗输入流中留下的任何尾随空格,甚至不会消耗到行的末尾,因此如果在同一输入流上也使用getchar()fgets(),请注意这一点 . 我们只是让scanf在转换之前跳过空格,就像 %d 和其他非字符转换一样 .


    请注意,除了转换之外的非空白"directives"(使用POSIX scanf terminology),如 scanf("order = %d", &order); 中的文字文本也不会跳过空格 . 文字 order 必须匹配要读取的下一个字符 .

    所以你可能想要 " order = %d" ,如果你想跳过前一行的换行,但仍然需要一个固定字符串的文字匹配,like this question .

  • 0

    使用 scanf(" %c", &c2); . 这将解决您的问题 .

  • 24

    在调用第二个 scanf() 之前使用 getchar() .

    scanf("%c", &c1);
    getchar();  // <== remove newline
    scanf("%c", &c2);
    

相关问题