以下是一个可以实现字符串减1操作的C语言函数示例:
#include
#include
void subtractOne(char* str) {
int n = strlen(str);
if (n == 0) return;
int carry = 1;
for (int i = n-1; i >= 0; i--) {
int digit = str[i] - '0' - carry;
if (digit < 0) {
digit += 10;
carry = 1;
} else {
carry = 0;
}
str[i] = digit + '0';
if (carry == 0) break;
}
if (str[0] == '0') {
for (int i = 1; i < n; i++) {
str[i-1] = str[i];
}
str[n-1] = '\0';
}
}
int main() {
char str[] = "123";
subtractOne(str); // 输出"122"
printf("%s", str);
return 0;
}
该函数取字符串的每个数字字符,从右向左进行处理。例如,对于字符串“123”,首先从第三个字符‘3’开始处理。由于要减1,carry设为1,减去1后的结果为2,赋值给当前位置,即第三个字符‘3’变为‘2’。由于carry已设为1,数字2还要借位,因此carry被设为1,digit变为2+10-1=11,再次赋值给当前位置,即第三个字符‘2’变为‘1’。同理,第一个字符‘1’也要减1,结果为0,carry设为1,变成9,再次赋值给第一个字符,即第一个字符‘1’变成了‘0’。最后需要剔除前导0。
该函数可以处理任意长度的字符串,并且可以正确处理数字为0时的情况。