此程序中的意外输出

时间:2011-03-30 18:03:49

标签: c

#include<stdio.h>
int main()
{
    char arr[20];
    printf("\nEnter your name: ");
    gets(arr);
    printf(arr);
}

输入:%d%s%u

输出:0<null>-056716812[

为什么输出会这样?

5 个答案:

答案 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)

printfformat 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);