1

1. convを表示しようとすると何も表示されませんが、下付き文字を使用して1つの要素を印刷すると、内容を確認できます。
2. 10進数を2進数、8進数、16進数に変換するプログラム

#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

変化する

printf("Decimal to base %d is :\t%s\n",base,conv);

printf("Decimal to base %d is :\t%s\n",base,ptr);

また

内容 (ptr - 文字列の末尾まで) を conv 配列の先頭に移動します

もう 1 つの方法は、end から write の代わりにconv、start から write し、完了したら呼び出し strrev()て逆にすることです。

printf("Decimal to base %d is :\t%s\n",base,strrev(conv));

于 2013-02-06T08:20:28.260 に答える
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 に答える
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 に答える