使用%s不会打印字符数组

时间:2013-02-06 04:21:52

标签: c arrays char base-conversion

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;  
}  

5 个答案:

答案 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'