#include<stdio.h>
int main()
{
char arr[20];
printf("\nEnter your name: ");
gets(arr);
printf(arr);
}
输入:%d%s%u
输出:0<null>-056716812[
为什么输出会这样?
答案 0 :(得分:4)
您可能还没有遇到格式化输出。 printf()
将字符串作为其第一个参数,然后是可变数量的额外参数。在第一个参数中找到的特殊字符串将替换为额外参数中提供的值。例如:
int i = 42;
printf("%d", i);
输出42。
或者你可以写:
char name[] = "The Devil";
int num = 666;
printf("My name is %s and my favourite number is %d.", name, num);
嗯,你可以想象会发生什么。
现在,如果你回顾一下你的问题,很容易看出发生了什么。你实际上在写:
printf("%d%s%u");
但由于您没有为3个占位符提供任何值,因此结果是垃圾 - 技术上称为未定义的行为。
答案 1 :(得分:3)
printf
在format string
的控制下写入输出,指定后续参数(或通过可变长度参数访问的参数)如何转换为输出。
如果printf
调用中提供的参数数量少于转换说明符数,则行为未定义。
这就是应该如何进行通话printf("%s",arr)
。
顺便说一下,你可能想尝试一些更有趣的东西 - printf(arr,20,arr,20)
- 替换它并看到乐趣,但要确保输入仍然与你给出的相同,即{%d%s%u
1}}
答案 2 :(得分:1)
gets
不安全。它不检查缓冲区溢出。改为使用fgets。
fgets(arr,sizeof(arr),stdin) ;
并打印 -
printf("%s", arr) ;
答案 3 :(得分:0)
这不是使用printf的方法,你应该printf("%s", arr);
从arr指向的地方打印一个字符串。你调用它的方式,它实际上被称为printf("%d%s%u");
给你一个垃圾,取决于调用约定,你会得到不同的结果。在cdecl的情况下,它将打印堆栈中的下一个元素作为int,然后是由以下元素指向的字符串,然后将下一个元素作为unsigned int打印。
答案 4 :(得分:0)
您似乎想使用gets
的对应部分,即puts
:
puts(arr);