1

バイナリ コンバーターを作成することにしました。コードは小さくてシンプルで、整数を取り、結果のバイナリ文字列で char* を出力することになっています。

ここでの問題は、最後の sprintf が常に最後に付加された文字を 2 倍にしているように見えることです。

たとえば、答えが 1001001 である場合は 11001001 と出力され、-10 であると想定される場合は --10 と出力されます。

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

void bin_string( char** buffer ,int num ){

    bool neg = false;

    if ( num < 0 ){
        neg = true;
        num = ~num+1;
    }

    if( num == 0 )
        sprintf( *buffer, "%d", 0 );

    while( num > 0 ){

        int rem = num%2;

        sprintf( *buffer, "%d%s", rem, *buffer );

        printf("iteration: %s rem: %d\n", *buffer, rem );
        num = num/2;
    }

    if( neg )
        sprintf( *buffer, "-%s", *buffer );
}

int main( int argc, char** argv ){

    char* a = malloc( sizeof(char)*64 );
    bin_string( &a, 73 );

    printf("Result %s\n",a ); /* output is 11001001 but should be 1001001*/

    return 0;
}
4

3 に答える 3

5

sprintf()C99以降の宣言は次のとおりです。

    int sprintf(char *restrict s, const char *restrict format, ...);

restrictあなたはその宣言の一部に違反しています。たとえば、次のものを使用しています。

sprintf(*buffer, "-%s", *buffer);

これはその場でバッファを変更しようとしており、未定義の動作です。ほぼ正気の結果が得られたのは幸運か、あるいは不運かもしれません。への呼び出しの末尾の引数でターゲット バッファを使用することはできませんsprintf()

于 2013-02-18T19:54:36.133 に答える
2

答えは、自分自身に向かっているときに未定義の動作sprintf()を呼び出しているということです*buffer。代わりにすべきことは次のようなものです。

void bit_string(char *buf, int n)
{
    int nbits = sizeof(n) * CHAR_BIT;
    int i;
    for (i = 0; i < nbits; i++) {
        buf[i] = '0' + ((n >> (nbits - i - 1)) & 1);
    }
    buf[nbits] = 0;
}

(はい、私はあなたのために効率、読みやすさ、移植性にも気を配っています-どういたしまして。)

于 2013-02-18T20:06:26.763 に答える
2

sprintfは、それ自体にバッファーを挿入するほど賢くないと思います。おそらく2つのバッファーが必要であり、それらを交換する必要があります。

于 2013-02-18T19:53:40.487 に答える