所以我有这段代码:
#include <stdio.h>
int main() {
char B,y[2];
scanf("%c",&B);
scanf("%s",y);
printf("%c\n",B);
}
当我输入像S
这样的B字符时,那么y的字符就像a
一样,它运行正常。
打印出来
a
S
但是,当我为ab
输入2个字符时,它会打印两个字符,但不会打印出S
。
它打印:
ab
我做错了吗?
答案 0 :(得分:5)
首先,定义为char
的{{1}}数组只能容纳一个y[2]
而另一个空间保留,用于终止该数组的null表现为 string 。换句话说,它可以容纳的字符串的最大长度仅为1.
那就是说,根据理解,你应该改变
char
到
scanf("%s",y);
限制输入长度。否则,您将遇到缓冲区溢出,它会调用undefined behavior。
要详细说明在格式字符串中添加文字 scanf("%1s",y);
,1
表示最大字段宽度。
引用1
,章节§7.21.6.2, C11
,(强调我的)
从流中读取输入项,除非规范包含n说明符。 <强>一种 输入项被定义为输入字符的最长序列,不超过 任何指定的字段宽度,它是匹配输入序列的前缀,或者是匹配输入序列的前缀。 [....]