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

相同逻辑处理两个字符串却输出不同结果,求排查原因

问题原因与修复

核心错误

处理第二个字符串b1的循环条件写错了:

  • 处理a1时用的是逻辑或||:*(a1+i) == '0' || *(a1+i) == ' ',符合“去除前导零或空格”的需求。
  • 处理b1时误写成了逻辑与&&:*(b1+i) == '0' && *(b1+i) == ' ',一个字符不可能同时是'0'和' ',这个条件永远不成立,所以b1从未被移动,始终指向原始字符串首地址,自然strlen(b1)等于原字符串长度29。

其他潜在问题

  1. 内存泄漏:malloc分配的a1和b1没有调用free释放,长期运行会耗尽内存。
  2. 低效循环:循环条件里每次调用strlen(a)/strlen(b),strlen会重复遍历整个字符串,建议提前把长度存到变量里。
  3. 指针操作不当:直接移动a1/b1指针,会丢失malloc返回的原始地址,导致无法释放内存,更安全的方式是用索引记录跳过的位置。

修复后的代码示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *lstrip(const char *a, const char *b)
{
    // 提前计算字符串长度
    size_t len_a = strlen(a);
    size_t len_b = strlen(b);
    
    char* a1 = malloc(len_a + 1);
    char* b1 = malloc(len_b + 1);
    if (!a1 || !b1) { // 检查malloc是否成功
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    strcpy(b1, b);
    strcpy(a1, a);
    
    // 处理a1:用索引记录跳过的位置,不直接移动原始指针
    size_t skip_a = 0;
    while (skip_a < len_a && (a1[skip_a] == '0' || a1[skip_a] == ' ')) {
        skip_a++;
    }
    char* trimmed_a = a1 + skip_a;
    
    // 处理b1:修正逻辑与为逻辑或,同样用索引方式
    size_t skip_b = 0;
    while (skip_b < len_b && (b1[skip_b] == '0' || b1[skip_b] == ' ')) {
        skip_b++;
    }
    char* trimmed_b = b1 + skip_b;
    
    printf("strlen trimmed_a %zu \n", strlen(trimmed_a));
    printf("strlen trimmed_b %zu \n", strlen(trimmed_b));
    
    // 释放内存,避免泄漏
    free(a1);
    free(b1);
    
    return ""; // 返回空字符串代替空格,更合理
}

int main(){
    lstrip("00000000000000000000000000000","00000000000000000000000000000");
    return 0;
}

输出结果会变成:

strlen trimmed_a 0 
strlen trimmed_b 0 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:27