我有一个将十进制整数转换为二进制的函数,并将结果存储在大小为32的char数组中(用零填充):
void ConvertToBinary(int DecimalNumber,char (&binNumber)[32])
{
int dec = DecimalNumber;
for(int pos = 31; pos >= 0; --pos)
{
binNumber[pos] = '0';
}
binNumber[32] = '\0';
for(int pos = 31; pos >= 1; --pos)
{
if(dec % 2) {
binNumber[pos] = '1';
}
dec = dec/2;
}
}
但是,当我在两个不同的数组上调用该函数两次时,第一个数组将被删除:
int main()
{
char binArray1[32],binArray2[32];
int dec1 = 89789879;
int dec2 = 80809765;
ConvertToBinary(dec1,binArray1);
printf("binArray1: %s\n",binArray1); //Correctly prints out the array.
ConvertToBinary(dec2,binArray2);
printf("binArray1: %s\n",binArray1); //Prints out nothing :(
printf("binArray2: %s\n",binArray2); //Prints out binArray2
return 0;
}
在研究了这个问题之后,我认为这个问题与将数组的引用作为参数传递有关。但是我不清楚为什么这会导致binNumber1
指向不同的地址。
有趣的是,我一直在Red Hat(x86)Linux机器上使用gcc 4.1.2版进行编译。当我在Visual Studio 2015上编译和运行时,我没有遇到这个问题。知道这里发生了什么吗?
提前致谢。
答案 0 :(得分:5)
%s
的{{1}}指令用于打印以空字符结尾的字符串。您的数组不以null结尾,因此您不应使用printf
输出它们。
相反,您可以在循环中打印它们:
%s
答案 1 :(得分:3)
binNumber[32] = '\0';
binNumber
是一个包含32个char
的数组。 binNumber[32]
不是该数组的有效索引,因此对它的赋值会产生未定义的行为。要保存32个字符和终止零,数组的大小应为33。
答案 2 :(得分:0)
如果你知道你有32位数,在这种情况下,你可以使用
printf("binArray1: %.32s\n",binArray1);
仅打印前32个字符。