scanf 裁剪数字的最后一个字节
scanf crops last byte of numbers
看看这个程序:
#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
中的一个字符。当它得到第二个数字不匹配的输入时,该数字被正确解析并且 return 值为 1。如果输入在数字后包含正确的字符,则 return 值为 2 并且type
被正确解析。但是,该数字的最后一个字节被裁剪了(如果我输入任何小于 256 的东西,我得到 0,但是如果我输入例如 258 或 510,我仍然得到 256)。为什么是这样?我做错了什么?
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;
}
如果您阅读例如this scanf
reference,您会看到 "%["
格式用于读取 字符串 ,其中当然包括写入字符串终止符。
由于您只提供了一个字符来存储读取的字符串,scanf
函数将总是 写出边界并且您有 undefined behavior。
发生的情况是,字符串终止符被写入变量 i
的部分存储空间 space。
看看这个程序:
#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
中的一个字符。当它得到第二个数字不匹配的输入时,该数字被正确解析并且 return 值为 1。如果输入在数字后包含正确的字符,则 return 值为 2 并且type
被正确解析。但是,该数字的最后一个字节被裁剪了(如果我输入任何小于 256 的东西,我得到 0,但是如果我输入例如 258 或 510,我仍然得到 256)。为什么是这样?我做错了什么?
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;
}
如果您阅读例如this scanf
reference,您会看到 "%["
格式用于读取 字符串 ,其中当然包括写入字符串终止符。
由于您只提供了一个字符来存储读取的字符串,scanf
函数将总是 写出边界并且您有 undefined behavior。
发生的情况是,字符串终止符被写入变量 i
的部分存储空间 space。