【问题标题】:Why gcc is allowing more than two characters of input to a char array of length 2? [duplicate]为什么 gcc 允许长度为 2 的 char 数组的输入超过两个字符? [复制]
【发布时间】:2026-02-04 15:05:01
【问题描述】:

我正在向某人解释基本的 C 数据类型以及它们如何工作,当我翻阅 char 数组时,我创建了一个长度为 5 的 char 数组作为 name,我向他声称你不能输入你的名字,因为他的名字是长度为 7,但最终它发生了, 我不知道这是怎么发生的 请有人向我解释一下这种行为是怎么发生的?

这是我使用的代码

#include<stdio.h>
#include<math.h>
int main(){
    char a[2] ; 
    scanf("%s",&a);
    printf("%s",a); 
}

【问题讨论】:

  • 它正在输入长度为 24 个字符的字符串
  • UB͏͏͏͏͏͏͏͏͏͏͏͏͏
  • 它叫做"undefined behavior"。解决方法是不要编写导致未定义行为的代码。
  • scanf("%s") 只是臭名昭著的不安全 gets 的另一个名称。
  • 这就是为什么scanf 在生产代码中通常不受欢迎的原因。 fgets() 比较常用。

标签: c arrays gcc


【解决方案1】:

你只是得到了未定义的行为。

在您的代码中,scanf() 无法知道最大大小(怎么可能,它只是一个函数),它只会假设您知道自己在做什么。

为防止这种情况,请传递信息:

const size_t got = scanf("%1s", a);
if(got == 1)
  printf("Read '%s'\n", a);

请注意,scanf() 的返回值是在依赖具有有效值的变量之前检查的好方法。它可能会失败。

【讨论】:

    最近更新 更多