看一下这个程序:
#include <stdio.h>
int main()
{
unsigned i = 0;
char type = 'a';
int result = scanf("%u%[asd]", &i, &type);
printf("result = %d, i = %u\n", result, i);
return 0;
}
它应接受一个数字,然后接受a
,s
或d
的字符。当它获得第二个数字不匹配的输入时,正确解析数字并返回值为1.如果输入在数字后面包含正确的字符,则返回值为2并且正确解析type
。但是,该数字的最后一个字节被裁剪(如果我输入的内容少于256,我得到0,但如果我输入例如258或510,我仍然得到256)。为什么是这样?我做错了什么?
答案 0 :(得分:3)
如果您阅读例如this scanf
reference,您会看到"%["
格式用于读取字符串,当然还包括编写字符串终结符字符。
由于您只提供一个字符来存储读取字符串,scanf
函数将始终写出越界,并且您有undefined behavior。
如果字符串终止符写在变量i
的部分存储空间上,会发生什么。
答案 1 :(得分:2)
int result = scanf("%u%[asd]", &i, &type);
说明符"%[...]"
用于扫描字符串。您有兴趣扫描单个字符。
更改type
或更改说明符。
#include <stdio.h>
int main()
{
unsigned i = 0;
char type[20] = "a"; // changing type
int result = scanf("%u%19[asd]", &i, type);
printf("result = %d, i = %u\n", result, i);
return 0;
}
#include <stdio.h>
int main()
{
unsigned i = 0;
char type = 'a';
int result = scanf("%u%c", &i, &type); // changing specifier
printf("result = %d, i = %u\n", result, i);
return 0;
}