C程序中的gets方法

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

我写了一个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吗?
非常感谢

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个字节。