1.虽然我试图显示转换它没有显示任何内容,但是当我使用下标打印一个元素时,我能够看到内容。
2.将十进制转换为二进制,八进制,十六进制的程序
#include<stdio.h>
int main()
{
convbase(23,2);
return 0;
}
int convbase(int num, int base)
{
char conv[33] = {' '};
char *ptr = &conv[32];
conv[32] = '\0';
do
{
*--ptr = "0123456789ABCDEF"[num % base];
num = num/base;
}while(num);
if(base == 16)
{
*--ptr = 'x';
*--ptr = '0';
}
if(base == 8)
{
*--ptr = '0';
}
printf("Decimal to base %d is :\t%s\n",base,conv);
return 0;
}
答案 0 :(得分:1)
您正在从末端向前填充阵列。在您的示例中,位串位于数组元素27 ... 31中。因此,第一个元素包含\ 0,并且char数组将被视为空字符串,并且不打印任何内容。 您可以通过在print语句中设置断点来轻松检查。
答案 1 :(得分:1)
您最合适地假设以下行将conv
初始化为所有空白:
char conv[33] = {' '};
这是不的情况。使用上面的代码conv
将其第一个字节设置为空白,将所有其他字节设置为0
。因此,只有至少有31位数字才能打印结果。
您可以考虑使用以下代码初始化conv
:
char conv[33] = {0}; /* default init: set conv to all zeros */
memset(conv, ' ', sizeof(conv) - 1); /* re-set all but the last to blank */
这一行:
conv[32] = '\0';
不再需要。
我同意ReinhardMänner使用调试器可以帮助你自己找到这个。
答案 2 :(得分:1)
更改
printf("Decimal to base %d is :\t%s\n",base,conv);
到
printf("Decimal to base %d is :\t%s\n",base,ptr);
或
将内容(ptr - 到字符串的结尾)移动到conv数组的开头
另一种选择是代替从conv
结束写入从开始写入,然后在完成后调用strrev()
来反转它。
printf("Decimal to base %d is :\t%s\n",base,strrev(conv));
答案 3 :(得分:0)
我认为你做的过多--
。
在构建字符串时,ptr
始终指向您要写下一个字符的位置(如果有下一个字符)。这个地方总是用空字节初始化(conv[0]
除外,这是一个空格
因此,当调用printf
时,ptr
指向空字节,这是一个空字符串。
ptr++
之前 printf
应该解决它。
答案 4 :(得分:0)
我同意@alk。
您只是初始化数组的第一个元素,并且其他元素被初始化为0,因为您获得了空行。 实际上,行不是空白,printf只打印第一个空白字符,当它遇到0时就会停止。
您可以将''替换为任何其他字符来验证它。当然除了'\ 0'