printf(“%d”)不显示我输入的内容
我的代码:
printf("Enter a number : "); scanf("%d", &number); printf("%d is what I entered\n", &number);
我输入2
,
预期输出: 2 is what I entered
实际输出: 2293324 is what I entered
这有什么问题?
printf("%d is what I entered\n", &number);
是错误的,因为%d
(在printf
)需要一个int
类型的参数,而不是int*
。 这将调用未定义的行为,如C11标准草案(n1570)中所示(强调我的) :
7.21.6.1 fprintf函数
[…]
- 如果转换规范无效,则行为未定义。 282) 如果任何参数不是相应转换规范的正确类型,则行为未定义 。
使用修复它
printf("%d is what I entered\n", number);
那么, 为什么scanf
需要&
变量名之前?
请记住,当您使用number
,您传递变量number
的值 ,当您使用&number
,您传递number
地址 ( &
是地址 – 运算符)。
因此, scanf
不需要知道数字的值。 它需要它的地址(在这种情况下为int*
)才能将输入写入其中。
另一方面, printf
不需要地址。 它只需要知道要打印的值(在本例中为int
)。 这就是为什么你不在printf
使用&
之前的变量名。
你正在使用运营商和 number
,意味着获取它的地址,所以你不打印数字的值,但它的地址,你应该:
printf("%d is what I entered\n", number);
如果您使用-Wall -g
编译器选项,那么您应该在编译期间看到错误:
# cc -Wall -g ex.c -o ex ex.c: In function 'main': ex.c:9:10: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=] printf("%d is what I entered\n", &number); ^
该&
操作数给出变量“number”的地址。 你不应该使用它。
解:
printf( "%d is what I entered\n", number);
#include int main(void) { printf("Enter a number: "); int number; scanf("%d", &number); printf("The number is: %d\n", number); return 0; }
这应该可以解决您的问题。
在scanf()
首先必须指定输入项的内容(int,float,char,char *等等),例如"%d"
用于整数。
之后,您必须获取商品的地址。 这就是为什么你必须在变量之前使用&
运算符。
由于您在printf()
上使用了&
运算符,因此发生了错误。 这基本上意味着您在存储整数的堆栈中打印地址。 但没有&
你打印实际值。
希望这可以帮助。
你可以尝试从号码中删除&只是简单地写号码
printf("%d is what I entered\n", number);
它实际上指向并显示输入的内存位置,即2