您好,我现在正在学习C语言,并且练习了我读过的这本书时遇到了一些问题。我的代码是这样的:
#include<stdio.h>
int main()
{
unsigned char one=0;
unsigned char two=0;
printf("Quantity 1 = ");
scanf("%d",&one);
printf("Quantity 2 = ");
scanf("%d",&two);
printf("The value is %d",one);
return 0;
}
为什么当我试图看到one
的初始值的值时,而不是scanf
之后的值?
答案 0 :(得分:8)
您需要将int
类型与%d
说明符结合使用,将char
与%c
说明符结合使用。并且%u
带有无符号整数。
#include<stdio.h>
int main()
{
unsigned int one=0; unsigned int two=0;
printf("Quantity 1 = ");scanf("%u",&one);
printf("Quantity 2 = ");scanf("%u",&two);
printf("The value is %u",one);
return 0;
}
Basicaly,scanf
将尝试从输入读取整数,并尝试将其存储在不够大的内存位置,因此您将有未定义的行为。
您可以找到好的参考here。
但是,如果您尝试将字符用于输入类型,您可能需要问问自己为什么没有机会输入第二个数量(如果您键入4
并按Enter键)。这是因为第二个scanf
将输入键作为字符。此外,如果您尝试键入21
(对于二十一个),它将使用2
填充第一个值,使用1
填充第二个值(以及使用其ASCII值)。
所以,要小心 - 确保始终为变量选择正确的类型。
答案 1 :(得分:3)
Never use scanf
。
Never use scanf
。
说真的,never use scanf
。
使用fgets
(或getline
,如果有的话)从用户读取整行输入,然后将字符串转换为strtol
或其亲属{{3 }和strtod
。 strtoul
也可能有用。
答案 2 :(得分:1)
通过读取其返回值来检查scanf()
是否正常工作。要快速入门,请在this link阅读有关scanf()
的详细信息。
您正在做的是使用"%d"
向unsigned char
变量输入一个整数,因此scanf()
可能无法正常工作。
答案 3 :(得分:1)
更改
unsigned char one=0; unsigned char two=0;
到
unsigned int one=0; unsigned int two=0;
并使用%u
代替%d
,然后它会在scanf()
之后打印该值。
答案 4 :(得分:1)
您将变量one
声明为char:
unsigned char one=0;
然后你告诉scanf
阅读int
:
scanf("%d",&one); /* %d means int */
Int大于char(通常为4字节对1字节),导致您描述的问题。
将您的scanf
更改为:
scanf("%c",&one); /* %c means char */
然后当你打印出值时,也打印一个char:
printf("The value is %c",one); /* %c means char */