相同逻辑处理两个字符串却输出不同结果,求排查原因
问题原因与修复
核心错误
处理第二个字符串b1的循环条件写错了:
- 处理
a1时用的是逻辑或||:*(a1+i) == '0' || *(a1+i) == ' ',符合“去除前导零或空格”的需求。 - 处理
b1时误写成了逻辑与&&:*(b1+i) == '0' && *(b1+i) == ' ',一个字符不可能同时是'0'和' ',这个条件永远不成立,所以b1从未被移动,始终指向原始字符串首地址,自然strlen(b1)等于原字符串长度29。
其他潜在问题
- 内存泄漏:
malloc分配的a1和b1没有调用free释放,长期运行会耗尽内存。 - 低效循环:循环条件里每次调用
strlen(a)/strlen(b),strlen会重复遍历整个字符串,建议提前把长度存到变量里。 - 指针操作不当:直接移动
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
相关产品推荐
相关产品推荐

