1

我正在处理一项任务并部分解决。目前我得到了正确的输出,只是相反。

这是我实现的辅助函数:

char int2char (int radix, int value) {

    char c = '?';

    if ((value >= 0 && value < radix) && (radix <= 36 && radix >= 2)){
        if (value < 10){
            c = value + 48;
        }
        else if (value >= 10 && value < 36) {
            c = value + 55;
        }   
    }

    return c;
}

到目前为止,我遇到困难的实际功能是这样的:

void int2str (int radix, int value) {

    int result = value % radix;
    int division = value / radix;
    char c;

    c = int2char(radix, result);
    putchar(c);

    while (division > 0) {
        return int2str(radix, division);
    }

}

第一个函数用于以十六进制表示数字 10-35。因此,如果模数产生一个 11,例如,我应该输出一个“B”。

这很好用,除了倒退!而且我不知道如何扭转它。最大的障碍是您只能使用 putchar() 作为输出。没有字符串,没有数组。

为了进一步澄清,如果我输入:

int2str 16 60

输出应该是'3C',而不是我得到'C3'。

4

3 回答 3

2

首先,您的使用while令人困惑,因为其中有 a return。将其替换为if. 是不必要的return,因为函数最后会自行返回。

完成此操作后,您可以通过putchar在递归调用之后移动 来反转输出:

if (division > 0) {
    int2str(radix, division);
}

putchar(c);

作为旁注,return int2str(radix, division);无论如何在这个函数中没有意义,因为它是一个void函数,所以没有什么可以返回。如果你确实想这样做(在这种情况下你不想这样做),你会说:

somefunction();
return;

'0'此外,如果您使用and'A'而不是 48 和 55 ,这可能会更清楚:

    if (value < 10){
        c = value + '0';
    }
    else if (value >= 10 && value < 36) {
        c = value - 10 + 'A';
    }   
于 2013-09-16T20:43:14.253 回答
1

result是最后一个数字,但您要先打印它。return从递归调用中删除并将 移到putchar末尾。此外,while循环应该是一个if.

void int2str(int radix, int value) {

    int lastdigit = value % radix;
    int firstdigits = value / radix;

    if (firstdigits) {
        int2str(radix, firstdigits);
    }

    putchar(int2char(radix, lastdigit));

}
于 2013-09-16T20:43:41.847 回答
0

Try this

c = int2char(radix, result);

if (division > 0) 
     int2str(radix, division);
putchar(c);

Last call to int2str will print first digit while first call will print last digit.

于 2013-09-16T20:45:30.250 回答