我正在编写一个简单的程序,将数字(+ 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)字符还是仅仅是巧合?
答案 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
不同,它将换行符留在缓冲区中。