[英]scanf and printf not printing right values
这里发生了什么? 代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char name[15];
char name_[15];
char answ[1];
printf("What's your name?\n");
scanf("%s", name);
strcpy(name_, name);
printf("Yes / No: ");
scanf("%s", answ);
printf("Hello! %s\n", name_);
printf("You said: %s\n", answ);
return 0;
}
输入“名称”和“是”,预期的 output 是它说:
你好! 姓名
你说:是的
相反,我得到:
你好! es
你说:是的
我还尝试在 %s 之前添加空格,但没有结果。
那么我到底错过了什么?
answ
只能包含 1 个字符。 所以目前,额外的字符"es"
+ '\0'
被写入分配给name_
的 memory 中。 因此, "es"
被打印出来。
您已经创建了一个经典的可利用缓冲区溢出,但在您的代码中。 这就是为什么大多数现代编译器会建议您将 sscanf 交换为 sscanf_s 或类似的。 正如其他人指出的那样,您会覆盖堆栈上的下一个变量。
我想提供这个答案基本上是说:永远不要使用 sscanf 或任何过时的、不安全的 C 函数。 即使这可能只是一个玩具示例,也请练习编写现代 C 代码。 从长远来看,您将从中受益。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.