2017-11-16 11 views
2

私は独自のprintf(演習用)を作成する必要があり、符号なしの数値をバイナリベースで出力する%bフラグを追加する必要があります。私は関数を作成しましたが、まだ出力で符号なしの数値を取得しています。そこに私のコードがあります。前もって感謝します!C:バイナリベースで符号なし整数を出力する

int unsignednbr(unsigned int nb) 
{ 
    if (nb < 0) 
    { 
     putchar('-'); 
     nb = nb * -1; 
    } 
    if (nb >= 10) 
    { 
     putnumber(nb/10); 
     putnumber(nb % 10); 
    } 
    else 
     putchar(nb + '0'); 
} 

int unsigned_to_binary(int nb) 
{ 
    long long binary_nbr = 0; 
    int remainder; 
    int i = 0; 

    unsignednbr(nb); 
    while (nb != 0) 
    { 
     remainder = nb % 2; 
     nb /= 2; 
     binary_nbr += remainder * i; 
     i *= 10; 
    } 
} 

void own_printf(char* format, ...) 
{ 
    int i = 0; 
    va_list args; 

    va_start(args, format); 
    while (format[i]) 
    { 
     if (format[i] == '%') 
     { 
      switch (format[i + 1]) 
      { 
      case 'b': 
       unsigned_to_binary (va_arg(args, int)); 
       break; 
      } 
      i++; 
     } 
    } 
    va_end(args); 
} 

int main() 
{ 
    own_printf("%b", -42); 
    return 0; 
} 
+1

実際に何かを実行する前に* decimal *出力関数を呼び出しています。それを除けば、そのアイデアは非常に悪いです。ちょうどビットを反復し、 '0'または' 1'を出力します。 –

+2

@Felixが指摘したこと以外に、両方の変換関数は 'int'と宣言されている間は何も返しません。また、unsigned print関数では、* unsigned *が負であるかどうかをチェックします。 – Mattenii

+0

[ビットの印刷例](https://ideone.com/eGtfSn) –

答えて

0

私はあなたがEpitechからのものだと思っていますが、助手に尋ねてみませんか? :p

とにかく、数値のバイナリ表現だけを印刷する場合は、ループ内で>>&の演算子を組み合わせて使用​​できます。 intの32ビットをそれぞれ繰り返し、10かを判断して印刷します。

unsigned int number = 42; 
for (int i = 0; i < 32; ++i) { 
    if (number >> i & 0x1) putchar('1'); 
    else putchar('0'); 
} 

putchar('\n'); 

この方法は多くの欠点を有している(バッファなし、遅い、... intは32ビットであると仮定して)それが動作するはずです。符号なしのparemeterが少ない0ということであるとして、あなたが受け取るint型かどうかをチェック機能unsignednbr

  • :それはさておき

    、あなたのコード内で見てみたいことがありいくつかのこと。これは常に間違った条件です。

  • unsigned_to_binary機能では、whileループの後に何も印刷しません。では、このループの目的は何ですか?値によって渡されるパラメーターは、実際にコピーされていること、およびこれらのコピーに対して行った変更は、コピーを受け取った関数にとってローカルであることに注意してください。ループの直前にunsignednbr関数が呼び出されても、それは役に立たないようです。
  • 時間がある場合は、関数ポインタの配列を使用してメインループを書き直してください。アシスタントを幸せにするでしょう! :p

幸運! :D

+0

これは最下位8ビットのみを出力します。 (不足している '<'を追加すると、今コンパイルされません) –

+0

ハハ。あなたは私を持っている! Btw、私は今少し失われていますが、私はあなたが言ったことをしようとします。 :D – Asez

+0

Wups、ありがとう、私は私のループを編集しました。 – Geographer

0

あなたは(再帰を使用して)を使用することができます以下

void printBinaryValue(unsigned int num) 
{ 
    if(!num) return; 

    printBinaryValue(num>>1); 
    putchar(((num&1 == 1) ? '1' : '0')); 
} 

はそれが0を含むすべての入力に対する所望の出力を提供しますhere

UPDATED
次のコードをワーキング見る(while-loopを使用)。

void printBinaryValue2(unsigned int num) 
{ 
    char result[sizeof(num)*8]; 
    int count = 0; 
    while(num) 
    { 
     result[count++] = ((num&1 == 1) ? '1' : '0'); 
     num>>=1; 
    } 
    if(count) 
    { 
     count--; 
     while(count>=0) 
     { 
      putchar(result[count--]); 
     } 
    } 
    else 
    { 
     putchar('0'); 
    } 
} 
関連する問題