Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此程序中出现意外输出 #包括 int main() { char-arr[20]; printf(“\n输入您的姓名:”); 获取(arr); printf(arr); }_C - Fatal编程技术网

此程序中出现意外输出 #包括 int main() { char-arr[20]; printf(“\n输入您的姓名:”); 获取(arr); printf(arr); }

此程序中出现意外输出 #包括 int main() { char-arr[20]; printf(“\n输入您的姓名:”); 获取(arr); printf(arr); },c,C,输入:%d%s%u 输出:0-056716812[ 为什么输出是这样的?printf在格式字符串的控制下写入输出,该字符串指定如何将后续参数(或通过可变长度参数访问的参数)转换为输出 如果printf调用中提供的参数数量小于转换说明符的数量,则行为未定义 这就是调用printf(“%s”,arr)的方式 顺便说一句,你可能想尝试一些更有趣的东西,那就是-printf(arr,20,arr,20)-替换它,看看有趣的地方,但是确保输入的内容仍然与你给出的相同,即,%d%s%u这不是使用printf

输入:
%d%s%u

输出:
0-056716812[


为什么输出是这样的?

printf
格式字符串的控制下写入输出,该字符串指定如何将后续参数(或通过可变长度参数访问的参数)转换为输出

如果
printf
调用中提供的参数数量小于转换说明符的数量,则行为未定义

这就是调用printf(“%s”,arr)
的方式


顺便说一句,你可能想尝试一些更有趣的东西,那就是-
printf(arr,20,arr,20)
-替换它,看看有趣的地方,但是确保输入的内容仍然与你给出的相同,即,
%d%s%u
这不是使用printf的方式,你应该这样做
printf(“%s”,arr)
从arr所指的位置打印字符串。按您所称的方式,它实际上被称为
printf(“%d%s%u”)给你一个垃圾的
,取决于调用约定,你会得到不同的结果。如果是,它会将堆栈上的下一个元素打印为int,然后将下一个元素指向的字符串打印为unsigned int。

gets
是不安全的。它不会检查缓冲区溢出。请使用fgets instead

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

fgets(arr,sizeof(arr),stdin) ;

似乎您想使用
get
的对应项,即
put

printf("%s", arr) ;

您可能还没有遇到格式化输出。
printf()
将字符串作为其第一个参数,然后是数量可变的额外参数。在第一个参数中找到的特殊字符串将替换为额外参数中提供的值。例如:

puts(arr);
产出42

或者你可以写:

int i = 42;
printf("%d", i);
你可以想象会发生什么

现在,如果你回顾你的问题,很容易看到发生了什么。你有效地写了:

char name[] = "The Devil";
int num = 666;
printf("My name is %s and my favourite number is %d.", name, num);

但是,由于您没有为3个占位符提供任何值,因此结果是垃圾-技术上称为未定义行为。

一些标准不愿意告诉我们的内容,请在此处阅读:是的,我知道。问题不在于此。我想知道printf为什么会这样。@Lohit-当您知道它不安全时,您为什么要使用它唱出来?你不认为这是自杀吗?Mahesh这只是一个测试程序。放松,没有人会攻击我的计算机。我确实知道格式化输出。我的问题是关于输入的。我本来希望代码不会编译。@Lohit::它应该包含可变数量的参数。
printf("%d%s%u");