我正在编写一个递归函数,它接受一个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
}
答案 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的第二个参数是
不是常量。(*p)++;
被禁止。将它们应用到您的函数可能有助于消除其中的错误。
答案 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