【发布时间】:2021-06-02 16:32:28
【问题描述】:
#include<stdio.h>
int main(){
char w[3];
scanf("%s",w);
printf("%s\n",w);
return 0;
}
例如,如果我给出一个包含 5 个字符的字符串“商品”。但我的数组只能容纳 2 个字符和一个 \0。我的输出是“商品”,为什么?
【问题讨论】:
-
您调用 Undefined Behavior 写入超出数组末尾的内容。如果不使用 field-width 修饰符来保护数组边界,则不能使用
scanf()读入数组,例如scanf ("%2s", w)-- 否则使用"%s"并不比gets()更安全。见Why gets() is so dangerous it should never be used! -
你会写超出数组的边界。这是未定义的行为。可能的结果是分段错误,变量神秘地改变了它们的值,或者在某些情况下你可能没有注意到任何东西。只是不要这样做。
-
"我的数组只能容纳 4" - 你的数组只能容纳 2,加上
\0自动添加的终止符987654329@. -
使用
fgets()接受用户输入总是更好,例如char w[3]; if (fgets (w, sizeof w, stdin)) puts (w);这限制了您在w中读取的字符数不超过2加上nul 终止字符。另外,不要吝啬缓冲区大小!。最好有 10,000 个字符太多而不是 1 个字符太少。这个网站上有数百个关于如何正确处理用户输入的答案。