Это потому, что *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
как и ожидалось.