C程序中的gets方法
我写了一个C程序,我对程序的输出感到困惑。 程序是这样的:C程序中的gets方法,c,C,我写了一个C程序,我对程序的输出感到困惑。 程序是这样的: int main() { char arr1[13] = "abcdefg"; char arr2[10]; gets(arr2); puts(arr2); strncat(arr1, arr2, 5); puts(arr1); puts(arr2); return 0; } 我输入qwertyuiop,结果是: qwertyuiop qwert qwertyuiop
int main()
{
char arr1[13] = "abcdefg";
char arr2[10];
gets(arr2);
puts(arr2);
strncat(arr1, arr2, 5);
puts(arr1);
puts(arr2);
return 0;
}
我输入qwertyuiop,结果是:
qwertyuiop
qwert
qwertyuiopqwert
有人能告诉我为什么arr1的值变成qwert吗?
非常感谢 arr1的值不是qwert 我编译并运行了这个程序,它给出了以下输出 输出控制台:
[root@abhishek replies]# ./rep2
qwertyuiop
qwertyuiop
abcdefgqwert
qwertyuiop
[root@abhishek replies]#
程序运行良好。
在这里,strncat工作得非常好 不要使用gets从用户读取数据,如果输入的数据超过数组大小arr2[10],数组将保留10个字节,因此没有\0的空间。它会导致未定义的行为
正因为如此,你得到了-
qwertyuiop
qwert
qwertyuiopqwert // Note the extra characters with arr2, That is more then your input
使用FGET从用户处读取输入-
fgets(arr2,10,stdin);
那么程序运行得很好。试试这个变化-
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[13] = "abcdefg";
char arr2[10];
// gets(arr2);
fgets(arr2,10,stdin); // it will read only 9 characters from user, 1 byte for null
puts(arr2);
strncat(arr1, arr2, 5);
puts(arr1);
puts(arr2);
return 0;
}
输出-
root@sathish1:~/My Docs/Programs# ./a.out
qwertyuiopasdf <- i have entered more than 10 character. But it reads only first 9 byte
qwertyuio
abcdefgqwert
qwertyuio
函数从stdin获取字符串读取,直到它读取换行符或文件结尾。在这两种情况下,它都会在末尾追加一个NUL字节
您的输入字符串qwertyuiop为10个字符,因此字符串总长度为11个字符。您在数组中只分配了10个字符。因此,程序的行为是未定义的。它可能会犯错,或者行为怪异
事实上,gets函数本质上是危险的。警察说
永远不要使用它。因为不知道真相是不可能说出的
将提前读取多少个字符的数据,因为
获取将继续存储超过缓冲区结尾的字符,
使用它是极其危险的。它被用来破坏计算机
安全改用fgets
可能重复,但相同的程序在我的机器上运行良好。不管Get做了什么,我都得到了这个问题的正确输出。@Abhishek,也许你很幸运!。未定义的事件随时可能发生!因为它是未定义的!我的意思是说,关于发布的问题,使用gets应该没有问题。@Abhishek请参阅harmic post!程序可能工作不正常,它有2个缓冲区溢出,导致未定义的行为。@否关于发布的问题,应该没有问题QWERTYUIOP读入arr2,即10个字符+一个nul字节,arr2溢出1个字节。