递归增量器

时间:2009-05-21 07:11:43

标签: c recursion

我正在编写一个递归函数,它接受一个char数组,它表示一个数字,以及一个指向该数组中数字的指针。该函数的要点是像++运算符一样递增数字。但是,当我尝试使用数字'819'时。它不会将其增加到'820',而是将其更改为'810'(它会增加最后一个数字,但不会执行我想要的递归)。有人可以帮我解决这个问题吗?感谢。

#include <stdio.h>

char* inc(char *num, char* p)
{   
    if( *p>='0' && *p<='8' )
    {
        *p++;
    }
    else if ( *p=='9' )
    {
        *p = '0';
        inc(num, --p);
    }

    return num;
}

main()
{
    char x[] = "819";

    printf("%s\n", inc(x, x+strlen(x)-1) ); //pass the number and a pointer to the last digit
}

4 个答案:

答案 0 :(得分:11)

更改*p++ to (*p)++;您想增加p。

中包含的数字
   char* inc(char *num, char* p)
    {   
        if( *p>='0' && *p<='8' )
        {
            (*p)++;       //==> change
        }
        else if ( *p=='9' )
        {
            *p = '0';
            inc(num, --p);
        }

        return num;
    }

修改

++运算符的优先级高于*。因此,

*p++ ==> *p then p++; // p's value before the increment.

请参阅优先顺序表here

答案 1 :(得分:4)

这是因为*p++检索字符然后递增指针。你想要(*p)++增加该指针处的字符:

#include <stdio.h>

char *inc (char *num, char* p) {
    if (*p >= '0' && *p <= '8') {
        (*p)++;
    } else if (*p == '9') {
        *p = '0';
        inc(num, --p);
    }
    return num;
}

你应该非常小心地在9xxx以上的字符串上运行它,因为你必须确保你为下一个数字留出空间(如果需要,预填充0)。否则添加保护,如下面的包裹功能:

#include <stdio.h>

char *inc (char *num, char* p) {
    if (p < num)
        return num;
    if ((*p < '0') || (*p > '9'))
        return num;
    if (*p < '9') {
        (*p)++;
        return num;
    }
    *p = '0';
    return inc(num, --p);
}

int main (int argc, char *argv[]) {
    char x[] = "819";
    char y[] = "8999";
    char z[] = "9999";
    char a[] = "aaa72";
    char b[] = "aaa279";
    char c[] = "aaa9999";
    printf("%s\n", inc(x, x+strlen(x)-1) );
    printf("%s\n", inc(y, y+strlen(y)-1) );
    printf("%s\n", inc(z, z+strlen(z)-1) );
    printf("%s\n", inc(a, a+strlen(a)-1) );
    printf("%s\n", inc(b, b+strlen(b)-1) );
    printf("%s\n", inc(c, c+strlen(c)-1) );
    return 0;
}

此代码导致:

820
9000
0000
aaa73
aaa280
aaa0000

正如所料。

答案 2 :(得分:1)

我始终遵循一些有助于在使用C ++编写时实现正确性的指南:

  • 请勿修改并获取其值 同一指令中的任何内容。inc(num, --p);被禁止 因为inc的第二个参数是 不是常量。
  • 永远不要取消引用a 指针并用它做一些事情 同一行。即所有形式的 (*p)++;被禁止。
  • 始终保证函数参数中的const-correctness
  • 命令/查询分离:函数通常应该是const或void。
  • 请勿使用 递归如果你可以避免它,即首先寻找非递归替代。 (这个问题是一个可以避免它的例子。)
  • 按合同设计。添加前提条件 开始和后置条件到 结束你的职能。

将它们应用到您的函数可能有助于消除其中的错误。

答案 3 :(得分:0)

在gcc上编译的原始程序的副作用示例,(这种副作用不会发生在@Pax程序中)

int
 main()
{
char x[] = "9";
char z[] = {57,57,57,57};

int t=0;
for(t=0;t<4;++t)
    printf("z == %d\n",z[t]);

inc(x, x+strlen(x)-1);

for(t=0;t<4;++t)
    printf("z == %d\n",z[t]);

}

输出:      z == 57      z == 57      z == 57      z == 57      z == 48      z == 48      z == 48      z == 48