在C程序中获取方法

时间:2014-08-28 06:26:56

标签: 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
qwertyuiopqwert

有人能告诉我为什么arr1的值变成了“qwert”吗? 非常感谢!

3 个答案:

答案 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工作得非常好。