C语言中的gets()函数是否会在输入字符串的末尾自动添加NULL字符?

时间:2019-02-19 18:07:05

标签: c arrays gets

我正在编写一个简单的程序,将数字(+ ve,32位)从二进制转换为十进制。这是我的代码:

int main()
{
    int n=0,i=0;
    char binary[33];
    gets(binary);
    for (i = 0; i < 33, binary[i] != '\0'; i++)
        n=n*2+binary[i]-'0';
    printf("%d",n);
}

如果我删除了binary[i]!='\0',那么由于垃圾值,它给出了错误的答案,但是如果我没有,它给出了正确的答案。我的问题是:gets函数会在字符串的末尾自动添加一个'\ 0'(NULL)字符还是仅仅是巧合?

2 个答案:

答案 0 :(得分:5)

是的,如果需要,写到binary[33]的结尾。

请勿使用gets;自动缓冲区溢出。

有关详细信息,请参见Why is the gets function so dangerous that it should not be used?

答案 1 :(得分:2)

当C标准最后一次支持gets(尽管已弃用)时,它具有以下描述(§7.19.7.7,gets函数):

  

gets函数从stdin指向的输入流中读取字符,   s指向的数组,直到遇到文件结尾或读取换行符。   删除所有换行符,并在最后一个字符读入数组后立即写入空字符。

这意味着,如果从stdin读取的字符串与s所指向的数组完全一样或更长,则gets仍会(尝试)附加字符串末尾的空字符。

即使您使用的是支持gets的编译器或C标准修订版,也不要使用它。 fgets更安全,因为它需要将缓冲区的大小作为参数写入,并且不会超出缓冲区的末尾。另一个区别是,它将与gets不同,它将换行符留在缓冲区中。