为什么在程序中两次使用 gets() 来获取两个不同数组的输入 returns 即使是第一个数组也只有第二个输入?
Why does using gets() twice in a program to take inputs for two different arrays returns only the second input even for the first array?
下面的代码接受两次输入并将其保存在两个单独的数组中。当使用 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);
}
- 不要使用
gets()
。不可能安全地使用并且会愉快地溢出你给它的任何和所有数组。此外,较新版本的 C 已将其完全删除。在 GCC 和 Clang 上,尝试使用 -std=c11
. 进行编译
- 您的阵列没有 space。它们的声明在 C 中在技术上是非法的(你不能有零大小的数组或空的初始值设定项),但编译器倾向于允许它们作为扩展。无论如何,C 数组不会动态增长以满足您的需求; C 太低级了。
- 因此,
gets
只是用读入的内容覆盖您的堆栈。并且由于这些数组的大小为 0,它们位于相同的位置,因此第二次读取会覆盖第一次。
总而言之,您的程序表现出许多未定义的行为,因此您不能依赖它做任何特别的事情。
您需要为数组提供足够的 space 来包含读取的字符串。您需要告诉读取功能不要读取超过 space 的数量。由于 gets
无法做到这一点,因此您需要使用 fgets
或其他 可能 的函数。
下面的代码接受两次输入并将其保存在两个单独的数组中。当使用 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);
}
- 不要使用
gets()
。不可能安全地使用并且会愉快地溢出你给它的任何和所有数组。此外,较新版本的 C 已将其完全删除。在 GCC 和 Clang 上,尝试使用-std=c11
. 进行编译
- 您的阵列没有 space。它们的声明在 C 中在技术上是非法的(你不能有零大小的数组或空的初始值设定项),但编译器倾向于允许它们作为扩展。无论如何,C 数组不会动态增长以满足您的需求; C 太低级了。
- 因此,
gets
只是用读入的内容覆盖您的堆栈。并且由于这些数组的大小为 0,它们位于相同的位置,因此第二次读取会覆盖第一次。
总而言之,您的程序表现出许多未定义的行为,因此您不能依赖它做任何特别的事情。
您需要为数组提供足够的 space 来包含读取的字符串。您需要告诉读取功能不要读取超过 space 的数量。由于 gets
无法做到这一点,因此您需要使用 fgets
或其他 可能 的函数。