C中扫描集的意外输出

时间:2015-05-22 04:11:02

标签: c set

正如预期的那样。应该接受一个数字,直到它遇到4,但它给了一些垃圾价值。为什么?

int main(void)
{

    int a;
    printf("Enter a number: ");
    scanf("%[^4]d", &a);

    printf("You entered: %d\n", a);

    return 0;

}

2 个答案:

答案 0 :(得分:2)

据我所知,扫描集应与字符串一起使用(这使得d不能作为整数占位符规范)。编写它的一种方法是将输入读入字符串然后解析它:

int main(void)
{
    int a;
    char b[255];
    printf("Enter a number: ");
    scanf("%254[^4]", &b);

    a = atoi(b);
    printf("You entered: %d\n", a);

    return 0;
}

我将修改后的代码保持在最低限度,你肯定需要对输入完整性进行一些额外的检查。

澄清:254前缀限制scanf将捕获的数据量,以便不超过缓冲区的大小(字符串以额外的空字符终止,因此读取长度必须小于实际尺寸) 1

答案 1 :(得分:1)

scanset仅处理字符。

这是我的示例代码。 (但是,我不知道你真正想要的是什么。)

#include <stdio.h>
int main(void) {
    char buffer[128];
    printf("Enter a number: ");
    scanf("%[^4]s", buffer);

    printf("You entered: %s\n", buffer);

    return 0;
}

结果是,

Enter a number: 12345678
You entered: 123

此外,如果您想要整数值,请使用atoi()