You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

前导零删除逻辑说明

  1. 首先遍历字符串开头,统计连续前导零的数量,注意当剩下的最后一个字符是0时(比如输入为"1"减1得到"0"),不统计该零为前导零
  2. 使用memmove函数将有效字符段整体前移,覆盖前导零的位置,该函数可安全处理内存重叠的场景
  3. 前移时需要连带拷贝字符串末尾的\0结束符,保证字符串合法性

内容的提问来源于stack exchange,提问作者Hayato Koyama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:15:04