【问题标题】:What happens when I give input as a string into an array which has size less than the string?当我将输入作为字符串输入到大小小于字符串的数组中时会发生什么?
【发布时间】: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 个字符太少。这个网站上有数百个关于如何正确处理用户输入的答案。

标签: arrays c string


【解决方案1】:

您将有输入溢出您传递的缓冲区。这将调用未定义的行为。这种行为可能暂时没有,也可能在很久以后使应用程序崩溃。您可能会出现分段违规和更多不利影响。

为避免这种情况,您应该使用fgets() 读取字符串,然后使用sscanf() 解析它。 fgets() 以缓冲区大小为参数,防止缓冲区溢出。

【讨论】:

  • 或者使用scanf中的正确说明符来限制char数组大小允许的字符数:%2s
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2020-09-25
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多