我写了一个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
qwertyuiopqwert
有人能告诉我为什么arr1的值变成了“qwert”吗? 非常感谢!
答案 0 :(得分:2)
不要使用gets
来读取用户的数据,如果输入的输入多于数组大小arr2[10]
,则数组保存10个字节,因此{ {1}}。它导致“未定义的行为”
由于这个原因,你得到了 -
\0
使用qwertyuiop
qwert
qwertyuiopqwert // Note the extra characters with arr2, That is more then your input
读取用户输入 -
fgets
然后程序运行正常。试试这个改变 -
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;
}
答案 1 :(得分:2)
函数gets
从stdin读取一个字符串,直到它读取换行符或文件结尾。在这两种情况下,它都会在末尾添加一个NUL字节。
您的输入字符串qwertyuiop
是10个字符,因此字符串总长度为11个字符。您只在阵列中分配了10个字符。因此,程序的行为是未定义的。它可能会出现段错误或表现得很奇怪。
事实上,gets
功能本质上是危险的。 man page说
永远不要使用gets()。因为不知道这是不可能的 数据提前读取多少个字符(),因为 gets()将继续存储超过缓冲区末尾的字符, 使用起来非常危险。它已被用来破坏计算机 安全。改为使用fgets()。
答案 2 :(得分:0)
arr1的值不是“qwert”
我编译并运行程序,它提供以下输出
输出控制台:
[root@abhishek replies]# ./rep2
qwertyuiop
qwertyuiop
abcdefgqwert
qwertyuiop
[root@abhishek replies]#
该计划工作正常 这里strncat工作得非常好。