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

它应该接受一个数字,然后是 asd 中的一个字符。当它得到第二个数字不匹配的输入时,该数字被正确解析并且 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。