scanf裁剪数字的最后一个字节

时间:2015-03-08 12:52:12

标签: c scanf

看一下这个程序:

#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;
}

它应接受一个数字,然后接受asd的字符。当它获得第二个数字不匹配的输入时,正确解析数字并返回值为1.如果输入在数字后面包含正确的字符,则返回值为2并且正确解析type 。但是,该数字的最后一个字节被裁剪(如果我输入的内容少于256,我得到0,但如果我输入例如258或510,我仍然得到256)。为什么是这样?我做错了什么?

2 个答案:

答案 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;
}