2016-09-22 3 views
0

私は数値のバイナリ表現を与えるC関数を書こうとしていますn。私が持っている関数は、数値を正しく表示します。Cの内部再帰関数から文字列配列に追加する方法

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

#define MAXBIN 100 

void printbitsrec(unsigned n, int n_bits, char *w) 
{ 
    if (n_bits-- > 0) { 
     printbitsrec(n >> 1, n_bits, w); 
     if (n & 1) { 
      printf("1"); 
      *w++ = '1'; 
     } 
     else { 
      printf("0"); 
      *w++ = '0'; 
     } 

    } 
} 

void printBits(unsigned n, int n_bits, int ret) 
{ 
    char word[MAXBIN]; 
    printbitsrec(n, n_bits, &word[0]); 
    word[n_bits + 1] = '\0'; 
    if (ret) 
     printf("\n"); 
    printf("word = %s\n", word); 
} 

int main() { 
    printBits(2, 4, 1); 
} 

はこれを行うにはよりエレガントな方法はありますか:しかし、私は、文字列配列wordが印刷されているのと同じデータで更新されたいですか?私のコードで何が間違っていますか?

+2

printbitでは、wは宣言されていません。 – Ishmeet

答えて

2

の下にチェックすると、ここに私の試みです:

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

#define MAXBIN 100 

char * printbitsrec(unsigned n, int n_bits, char *w) 
{ 
    if (n_bits-- > 0) { 
     w = printbitsrec(n >> 1, n_bits, w); 
     const char c = (n & 1) ? '1' : '0'; 
     putchar(c); 
     *w++ = c; 
    } 
    return w; 
} 

void printBits(unsigned n, int n_bits, int ret) 
{ 
    char word[MAXBIN]; 
    char * w = printbitsrec(n, n_bits, &word[0]); 
    *w++ = '\0'; 
    if (ret) 
     printf("\n"); 
    printf("word = %s\n", word); 
} 

int main(void) { 
    printBits(2, 4, 1); 
    return 0; 
} 

注目すべき変化:

  • のみ新を計算する文字列
  • の終わりを追跡するために返された値を使用します一度の文字
  • ではなくputcharを使用してください3210、ちょうど基本性能の検討(単一の文字を印刷する場合printf()が過剰である)

もちろん追加することができ、バッファオーバーフローを防止するための試みが行われないことに注意してください。

+0

再帰関数は非常に扱いにくいです。 – Aidenhjj

0

すべての問題を解決する再帰的な 関数内で配列インデックスを保持するためにグローバル変数を使用します。

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

#define MAXBIN 100 

static int i = 0; 
void printbitsrec(unsigned n, int n_bits, char *w) 
{ 
    if (n_bits-- > 0) { 
     printbitsrec(n >> 1, n_bits, w); 
     if (n & 1) { 
      printf("1"); 
      w[i] = '1'; 
     } 
     else { 
      printf("0"); 
      w[i] = '0'; 
     } 
     i++; 
    } 
} 

void printBits(unsigned n, int n_bits, int ret) 
{ 

    char word[MAXBIN]; 
    printbitsrec(n, n_bits, word); 
    word[i] = '\0'; 
    if (ret) 
     printf("\n"); 
    printf("word = %s\n", word); 
} 

int main() { 
    printBits(2, 4, 1); 
} 
+0

私は、このような問題の解決策として地球規模の国家を導入することは、あまりお勧めできないと思います。 – unwind

1

再帰関数呼び出しの問題があり、それはw++後に以下でなければなりません。コード

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 
    4 #define MAXBIN 100 
    5 
    6 void printbitsrec(unsigned n, int n_bits, char *w) 
    7 { 
    8  if (n_bits-- > 0) { 
    9   if (n & 1) { 
10    printf("1"); 
11    *w = '1'; 
12   } 
13   else { 
14    printf("0"); 
15    *w = '0'; 
16   } 
17   w++; 
18   printbitsrec(n >> 1, n_bits, w); 
19  } 
20 } 
21 
22 void printBits(unsigned n, int n_bits, int ret) 
23 { 
24  char word[MAXBIN]; 
25  memset(word, 0x00, sizeof(word)); 
26  printbitsrec(n, n_bits, &word[0]); 
27  //word[n_bits] = '\0'; 
28  if (ret) 
29   printf("\n"); 
30  printf("word = %s\n", word); 
31 } 
32 
33 int main() { 
34  printBits(2, 4, 1); 
35 } 
+0

これはバイナリ表現を後方に出力します。 – Aidenhjj

0

printbitsrec()の再帰呼び出しの後に* wをインクリメントすると、常に同じメモリ位置を指します。グローバル変数が気に入らなければ、うまくいきません。

void printBits(unsigned n, int n_bits, int ret) 
{ 
    char word[MAXBIN]; 

    memset(word,0,MAXBIN); 

    printbitsrec(n, n_bits, &word[0]); 
// *w++ = '\0'; 
    if (ret) 
     printf("\n"); 
    printf("word = %s\n", word); 
} 

void printbitsrec(unsigned n, int n_bits, char *w) 
{ 
    if (n_bits-- > 0) 
    { 
     w++; 
     printbitsrec(n >> 1, n_bits, w); 
     if (n & 1) 
     { 
      printf("1"); 
      *(w - 1)= '1'; 
     } 
     else 
     { 
      printf("0"); 
      *(w - 1) = '0'; 
     } 
    } 
} 
関連する問題