1

1.虽然我试图显示 conv 它没有显示任何内容,但是当我使用下标打印一个元素时,我能够看到内容。
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;  
}  
4

5 回答 5

1

您正在从末端向前面填充阵列。在您的示例中,位字符串位于数组元素 27...31 中。因此,第一个元素包含 \0,char 数组将被视为空字符串,不打印任何内容。您可以通过在 print 语句处设置断点来轻松检查这一点。

于 2013-02-06T06:40:23.147 回答
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'; 

不再需要了。


我确实同意Reinhard Männer的观点,即使用调试器可以帮助您自行发现这一点。

于 2013-02-06T07:43:34.720 回答
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));

于 2013-02-06T08:20:28.260 回答
0

我觉得你做的--太多了。

在构建字符串时,ptr始终指向您要写入下一个字符的位置(如果有下一个字符)。这个地方总是用空字节初始化(除了conv[0],它是一个空格。
所以在调用时printfptr指向空字节,它是一个空字符串。

ptr++之前printf应该解决它。

于 2013-02-06T08:09:37.173 回答
0

我同意@alk。

您只用空白初始化数组的第一个元素,其他元素被初始化为 0,因为您得到了空白行。实际上行不是空白的, printf 只打印第一个空白字符 ' ' 并且当它遇到 0 时它会停止。

您可以通过将 ' ' 替换为任何其他字符来验证它。当然除了 '\0'

于 2013-02-06T10:13:04.720 回答