【问题标题】:Concatenating a char in a recursive function in C在C中的递归函数中连接一个char
【发布时间】:2014-12-20 23:01:06
【问题描述】:

尽管我对高级语言有更多经验,但我在理解内存 allocation 以及 strings 如何在 C 中真正发挥作用时遇到了很多麻烦。

我正在尝试实现一个非常简单的以递归方式工作的基本转换器。唯一的问题是它应该返回 char* 而不是 int

这是我的代码。我已经测试了递归调用,如果我使用整数,它就可以工作。所以,问题肯定出在字符串部分。它给了我一个无限循环。

char* baseConversion(int num, int baseIn, int baseOut){

    //convert num to base ten

    int quotient = num / baseOut;

    int remainder = num % baseOut;

    char rem = (char)(((int)'0') + remainder);

    char *result = malloc(strlen(output) + 1);

    strcpy(result, rem);

    if (quotient == 0)
        return result;
    else
        return strcat(result, baseConversion(quotient, baseIn, baseOut));
}

非常感谢

【问题讨论】:

  • 我在任何地方都没有看到问题...
  • strcpy 的第二个参数必须是一个以 null 结尾的字符串。 rem 是一个字符,而不是一个字符串。
  • 第六行说有一个无限循环超酷的家伙;)
  • 真@Barmar。让我看看我能做什么。
  • @CoolGuy:问题不需要以问号结尾。

标签: c recursion char strcpy strcat


【解决方案1】:

变化:

strcpy(result, rem);

到:

result[0] = rem;
result[1] = 0;

这将创建一个包含rem 中字符的单字符串。

您可能还需要修复:

malloc(strlen(output)+1)

因为您的函数中没有名为 output 的变量。

【讨论】:

    【解决方案2】:

    如果我正确理解了您所说的,那么您需要的是以下内容

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * baseConversion( unsigned int x, unsigned int base )
    {
        unsigned int digit;
        char *p = NULL;
        size_t n = 2;
    
        if ( base > 10 || base < 2 ) base = 10;
    
        digit = x % base;
    
        if ( x / base ) p = baseConversion( x / base, base );
    
        if ( p ) n += strlen( p );
    
        p = realloc( p, n );
    
        *( p + n  - 2 ) = digit + '0';
        *( p + n  - 1 ) = '\0';
    
        return p;
    }   
    
    
    int main(void) 
    {
        unsigned int x = 255;
    
        char *p = baseConversion( x, 10 );
    
        printf( "%s\n", p );
    
        free( p );
    
        p = baseConversion( x, 8 );
    
        printf( "%s\n", p );
    
        free( p );
    
        p = baseConversion( x, 2 );
    
        printf( "%s\n", p );
    
        free( p );
    
        return 0;
    }
    

    输出是

    255
    377
    11111111
    

    附:当一个答案被标记为最佳但代码将从其他答案中使用时,这很有趣。:)

    【讨论】:

    • 我的问题是关于如何纠正无限循环。 @Barmar 帮我解决了这个问题。我不是在要求正确的算法。这就是你没有得到正确答案的原因。
    • @Luis Lavieri 我的回答是最有帮助的,因为它显示了应该如何正确编写程序。它教应该如何用 C 编写这样的程序。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2015-02-07
    • 2020-12-13
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多