C语言如何删除字符串首元素,实现数字串减1后去除前导零
C语言字符串整数减1及前导零删除解决方案
核心修改点
- 简化减法逻辑:利用ASCII码的数字连续性,直接计算减1后的字符值,删除冗余的多分支判断
- 修复无效代码:删除原逻辑中无意义的
if (len != '0')判断,该判断将整型长度与字符'0'的ASCII值对比,无实际作用 - 实现前导零删除:找到第一个非零字符的偏移量,将后续内容整体前移覆盖前导零,特殊处理输入为"1"时减1得到"0"的边界场景
完整实现代码
#include <stdio.h> #include <string.h> void str_subtract_one(char* num) { int len = strlen(num); // 直接用库函数获取字符串长度,无需手动循环计算 // 从末尾开始逐位减1 for (int j = len; j != 0; j--) { if (num[j-1] == '0') { num[j-1] = '9'; // 本位是0,减1后变9,需要继续向高位借位,不跳出循环 } else { // 非0位直接减1,借位结束,跳出循环 num[j-1] = (num[j-1] - '0' - 1) + '0'; break; } } // 处理前导零 int offset = 0; // 找到第一个非零字符的位置,最后剩余单个0时不统计为前导零 while (num[offset] == '0' && num[offset+1] != '\0') { offset++; } // 存在前导零的情况下,将有效内容前移到字符串开头 if (offset > 0) { memmove(num, num + offset, len - offset + 1); // +1是为了拷贝末尾的'\0'结束符 } } int main() { char nums[] = "10000"; str_subtract_one(nums); printf("\nQ5\nstr_subtract_one function result: %s\n",nums); // 额外测试场景 char test1[] = "100"; str_subtract_one(test1); printf("100减1结果: %s\n", test1); char test2[] = "1"; str_subtract_one(test2); printf("1减1结果: %s\n", test2); char test3[] = "2001"; str_subtract_one(test3); printf("2001减1结果: %s\n", test3); return 0; }
前导零删除逻辑说明
- 首先遍历字符串开头,统计连续前导零的数量,注意当剩下的最后一个字符是0时(比如输入为"1"减1得到"0"),不统计该零为前导零
- 使用
memmove函数将有效字符段整体前移,覆盖前导零的位置,该函数可安全处理内存重叠的场景 - 前移时需要连带拷贝字符串末尾的
\0结束符,保证字符串合法性
内容的提问来源于stack exchange,提问作者Hayato Koyama
相关产品推荐
相关产品推荐

