scanf 和 printf 不打印正确的值
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;
}
输入“name”和“yes”后,预期的输出是:
Hello! name
You said: yes
相反,我得到:
Hello! es
You said: yes
我也尝试在 %s 之前添加空格,但没有结果。
那么我到底错过了什么?
您只为一个 yes/no 个字符的答案分配了 space,但正在向其中写入更多字符。
这导致 undefined behaviour。
您需要为 answ
分配更多 space,不要忘记 NUL 终止符。
answ
只能包含 1 个字符。所以目前,额外的字符 "es"
+ '[=12=]'
被写入分配给 name_
的内存中。
因此,"es"
被打印出来。
您已经在 运行 但在您的代码中创建了一个经典的可利用缓冲区。这就是为什么大多数现代编译器会建议您将 sscanf 换成 sscanf_s 或类似的原因。正如其他人指出的那样,您覆盖了堆栈中的下一个变量。
我想提供这个答案基本上就是说:永远不要使用 sscanf 或任何过时的、不安全的 C 函数。即使这可能只是一个玩具示例,也可以练习编写现代 C 代码。您将在长期 运行.
中受益
这是怎么回事? 代码如下:
#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;
}
输入“name”和“yes”后,预期的输出是:
Hello! name
You said: yes
相反,我得到:
Hello! es
You said: yes
我也尝试在 %s 之前添加空格,但没有结果。
那么我到底错过了什么?
您只为一个 yes/no 个字符的答案分配了 space,但正在向其中写入更多字符。
这导致 undefined behaviour。
您需要为 answ
分配更多 space,不要忘记 NUL 终止符。
answ
只能包含 1 个字符。所以目前,额外的字符 "es"
+ '[=12=]'
被写入分配给 name_
的内存中。
因此,"es"
被打印出来。
您已经在 运行 但在您的代码中创建了一个经典的可利用缓冲区。这就是为什么大多数现代编译器会建议您将 sscanf 换成 sscanf_s 或类似的原因。正如其他人指出的那样,您覆盖了堆栈中的下一个变量。
我想提供这个答案基本上就是说:永远不要使用 sscanf 或任何过时的、不安全的 C 函数。即使这可能只是一个玩具示例,也可以练习编写现代 C 代码。您将在长期 运行.
中受益