【问题标题】:Whitespace before %c specification in the format specifier of scanf function in CC 中 scanf 函数的格式说明符中 %c 规范之前的空格
【发布时间】:2016-07-29 23:38:16
【问题描述】:

当我在以下程序中scanf() 函数的格式字符串中不包含%d%c 规范之间的空格,并在运行时将输入输入为“4 h”时,则输出是“整数 = 4 和字符 = 。

在这种情况下,变量"c" 究竟是如何接受输入的?如果我在%d%c 规范之间包含一个空格,它有什么区别?

代码

#include <stdio.h>

int main()
{
    char c;
    int i;
    printf("Enter an Integer and a character:\n");
    scanf("%d %c",&i,&c);
    printf("Integer = %d and Character = %c\n",i,c);
    getch();
} 

【问题讨论】:

  • @petercordes 我打开了这个,因为我认为这是我再次遇到的另一种情况,即将%c 没有前面的空格放在一行上,没有关于“缓冲区中的换行符”的问题"所以有点不同。
  • @AnttiHaapala:我想我将它作为scanf() leaves the new line char in the buffer 的副本关闭了,因为最终的问题是相同的:%c 本身(与其他转换不同)将读取一个空格,如果那是下一个字符。但是格式字符串中的文字空间会消耗任意数量的空格。不过,重新开放很好;这里的答案很好。

标签: c character scanf format-specifiers


【解决方案1】:

scanf%c 说明符之前的空格指示它跳过任意数量的空格。换句话说,从标准输入读取,直到发现非空白字符或键盘中断。

【讨论】:

  • 这意味着当我不使用 %d 和 %c 规范之间的空格时,当输入为“4 h”时,编译器将“空格”分配给 char 变量“c”我说的对吗??
  • @Shubhamdubey2111;是的。没错。
  • 此外,如果两个整数而不是一个字符和一个整数正在播放,则包括/排除空格不会影响程序。为什么??
  • 这对%c 说明符有效?当然不会消耗前导空格,它适用于至少 2 个其他格式说明符。
【解决方案2】:

如果您仔细阅读 scanf() 的规范,大多数格式说明符都会跳过前导空格。在标准 C 中,有三个没有:

  • %n — 到目前为止已经处理了多少个字符
  • %[…] — 扫描集
  • %c — 读取一个字符。

(POSIX 增加了第四个,%C,相当于%lc。)

应跳过输入的空白​​字符(由isspace 指定),除非转换规范包含[cCn 转换说明符。

%d%c 之间添加空格意味着在读取整数之后和读取(非空格)字符之前跳过可选的空格。

请注意,格式字符串中的文字字符(空格除外,例如"X%dY" 中的XY)不会跳过空格。匹配此类字符也不算成功转换;它们不会影响来自scanf() 等人的返回值。

【讨论】:

  • 此外,如果两个整数而不是一个字符和一个整数正在播放,则包括/排除空格不会影响程序。为什么??
  • @Shubhamdubey2111 答案在于“如果您仔细阅读 scanf() 的规范,大多数格式说明符 (如 %d) 会跳过前导空格。在标准 C 中,有三个没有:"
  • 好的..现在我明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2012-09-19
  • 2016-04-04
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多