首页 > 解决方案 > 为什么在程序中两次使用gets()来获取两个不同数组的输入,即使是第一个数组也只返回第二个输入?

问题描述

下面的代码接受两次输入并将其保存在两个单独的数组中。当使用 puts() 打印这些数组时,puts(array1);返回的值与puts(array1);. 为什么会这样?

int main()
{
    char array1[]={};
    char array2[]={};

    printf("Enter String 1: ");
    gets(array1);

    printf("Enter String 2: ");
    gets(array2);

    puts(array1);
    puts(array2);
}

标签: carraysstringgets

解决方案


  • 不要使用gets(). 安全使用是不可能的,并且会愉快地溢出你给它的任何和所有数组。此外,较新版本的 C 完全删除了它。在 GCC 和 Clang 上,尝试使用-std=c11.
  • 您的阵列没有空间。它们的声明在 C 中在技术上是非法的(你不能有零大小的数组或空的初始化程序),但编译器倾向于允许它们作为扩展。在任何情况下,C 数组都不会动态增长以满足您的需求。C 太低级了。
  • 因此,gets只需用读取的任何内容覆盖您的堆栈。由于这些数组的大小为 0,它们位于同一位置,因此第二次读取会覆盖第一次。

总而言之,您的程序表现出许多未定义的行为,因此您不能依赖它做任何特别的事情。

您需要为数组提供足够的空间来包含读取的字符串。您需要告诉 read 函数不要读取超出您的空间的内容。由于这是不可能的gets,因此您需要在可能的情况下使用fgets或其他功能。


推荐阅读