【问题标题】:Does Scanf function ignore the Enter key when looking for %d match?Scanf 函数在查找 %d 匹配项时是否忽略 Enter 键?
【发布时间】:2016-10-28 14:55:41
【问题描述】:

我是 C 语言的新手,我正在阅读 Kim N. King 的一本书。它说 scanf() 寻找忽略空格的数字模式,但我认为它也会跳过 Enter 键。而如果它寻找字符,它显然也需要空格。

因此,在这个示例代码中,我必须在第二个scanf() 之前使用getchar() 清除流,否则将执行第二个而不等待用户输入。

printf("Enter a char: ");
scanf("%c", &ch1);
getchar();
printf("\nEnter another char: ");
scanf("%c", &ch2);

如果我改为寻找数字,我没有问题。

printf("Enter a number: ");
scanf("%d", &n1);
printf("\nEnter another number: ");
scanf("%d", &n2);

我的假设(它跳过 Enter 键)对吗?

【问题讨论】:

  • 什么是“输入关键字”?换行符是空格之一。
  • 空格不一定是单个空格。 isspace 搜索空格,即换行符、回车符、换行符、垂直/水平制表符和单个空格(可能我忘记了一些)。
  • 对不起,我的意思是输入键或返回键。我编辑它。
  • 你的假设是错误的。不会从 C 流中读取“密钥”,因此永远不会被跳过。

标签: c whitespace scanf format-specifiers


【解决方案1】:

ENTER 键输入一个newline (\n),它是一个空格字符。

引用C11,第 7.21.6.2 章,fscanf()

作为转换规范的指令定义了一组匹配的输入序列,如 下面对每个说明符进行描述。转换规范按以下步骤执行:

  1. 输入的空白​​字符(由isspace 函数指定)被跳过,除非 该规范包括[cn 说明符。 [....]

所以,是的,对于%d,任何前导空格(存在于输入缓冲区中)都会被跳过或忽略。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多