【问题标题】:How to add to String Array from inside recursive function in C如何从C中的递归函数内部添加到字符串数组
【发布时间】:2017-01-31 00:09:30
【问题描述】:

我正在尝试编写一个 C 函数,它将为我提供数字 n 的二进制表示。我拥有的功能可以正确打印数字;但是我希望字符串数组 word 使用与正在打印的相同数据进行更新:

#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);
}

有没有更优雅的方法来做到这一点?我的代码做错了什么?

【问题讨论】:

  • 在 printBits 中,w 未声明。

标签: c arrays string binary


【解决方案1】:

这是我的尝试:

#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 而不是printf(),这只是一个基本的性能考虑(printf() 在打印单个字符时是多余的)

请注意,没有尝试防止缓冲区溢出,当然可以添加。

【讨论】:

    【解决方案2】:

    递归函数调用有问题,应该在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 }
    

    【讨论】:

    • 这会向后打印二进制表示。
    【解决方案3】:

    采用任何全局变量来保留递归内的数组索引 功能将解决您的问题。

    #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);
    }
    

    【讨论】:

    • 我认为引入全局状态作为此类问题的解决方案是非常不明智的。
    【解决方案4】:

    当您在递归调用 printbitsrec() 之后递增 *w 时,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';
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2020-09-05
      • 2021-12-30
      • 2021-01-17
      相关资源
      最近更新 更多