我是C的初学者,我正在编写一个代码来打印用户输入字符的正方形。
通常当我们需要使用scanf()
输入两个整数(比如x和y)时我们写这个scanf("%d%d", &x, &y)
但是根据我的代码的需要我应该输入一个整数(比如m)和一个角色(比如说ch)。
我把它写成scanf("%d%c", &x, &ch)
但它有一个错误,当我执行程序时它只询问输入的积分值然后它就会停止执行。
我搜索了这个,我发现我需要在%d
和%c
之间留出空格scanf("%d %c", &x, &ch);
任何人都可以解释为什么我们需要在它之间留出空间吗?
答案 0 :(得分:11)
格式字符串中的空白字符的含义(来自http://www.cplusplus.com/reference/cstdio/scanf/?kw=scanf):
空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格,换行符和制表符 - 请参阅isspace)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括无)。
当你的代码是:
scanf("%d%c", &x, &ch)
然后输入
10
在你的控制台中:
10
已读取并存储在x
。ch
。如果您使用
scanf("%d %c", &x, &ch)
然后输入
10
10
已读取并存储在x
。ch
。这是因为stdin
通常是行缓冲的。答案 1 :(得分:4)
scanf
中的几乎所有格式说明符都会在尝试读取任何内容之前自动跳过所有空格。例如,%d
的工作原理(以及%s
,%f
和大多数其他说明符)。但是,%c
是此行为的例外。 %c
不会跳过空格。如果您的输入数据包含空白字符,%c
会很乐意将该字符读入您的ch
变量。
这很可能是你的情况。如果输入
5 #
要创建一个5x5平方的#
s,%d
说明符会将5
读入x
并停止读取空格字符。然后%c
会将该空格字符读入ch
。然后您的程序将继续,#
未读。你的程序的其余部分很可能实际上按预期工作。只是因为ch
是 space 字符,它会显示一个5x5平方的空间字符,这些字符是不可见的:)要使scanf
成为5#
在其原始形式的工作中,您必须输入您的数据
scanf
但确保您的#
实际上将ch
字符读入scanf
的更好方法是明确要求ch
在阅读之前跳过所有空格{{ 1}}。在scanf
中,这是通过在格式字符串中插入任何空格字符(空格,换行符,制表符等)来完成的。这个
scanf("%d %c", &x, &ch);
将强制scanf
在5
之后跳过该空格,并将#
读入ch
。这也适用于像这样的输入
5 #
甚至喜欢这个
5
#
因为scanf
会自动跳过所有空格,直到它到达#
。另请注意,即使使用更新的格式,也不需要在输入中输入空格,这意味着此输入
5#
仍然可以使用更新后的scanf
。
您也可以使用这些变体
scanf("%d\t%c", &x, &ch);
scanf("%d\n%c", &x, &ch);
scanf("%d %c", &x, &ch);
scanf("%d \n \t %c", &x, &ch);
实现同样的目标。它们都是等价的。第一个变体(带空格)看起来更好。