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函数

[…]

  1. 如果转换规范无效,则行为未定义。 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