为什么我的C语言程序输出倒数第三个字符为空格,修改str变量也无效?
问题根源分析
- 核心bug1:
a、b两个局部变量未初始化,一旦输入字符串不存在>或者>之后没有<,这两个变量会取到栈上的随机值,后续所有内存访问都是非法的,这就是你修改str之后运行结果完全不变的原因——程序根本没用到你输入的字符串内容,一直在访问随机内存地址。 - 核心bug2:for循环的条件错误使用了逗号运算符:
p < b - a - 1, q < b。C语言中逗号运算符会执行左右两个表达式,但最终整个表达式的取值只有右侧表达式的结果,左侧的p < b - a - 1条件完全不会生效,一旦出现b远大于b-a-1的场景,就会出现数组越界访问,多读取不属于目标范围的字符,你看到的倒数第三个位置的空格就是越界读取到的无关字符。 - 优化点:
array[b - a] = '\0'不需要放在循环体内重复执行,放在循环结束后执行一次即可;频繁调用strlen会重复遍历字符串,建议提前计算字符串长度缓存。
修复后的代码
#include <stdio.h> #include <string.h> void parser(char array[]) { int a = -1, b = -1; int len = strlen(array); // 找第一个>的位置 for (int i = 0; i < len; i++) { if (array[i] == '>') { a = i; break; } } // 没找到>直接返回 if (a == -1) { return; } // 找a之后最后一个<的位置 for (int j = a; j < len; j++) { if (array[j] == '<') { b = j; } } // 没找到符合要求的<直接返回 if (b == -1 || b <= a) { return; } int copy_len = b - a - 1; // 循环条件修改为逻辑与,两个条件都要满足 for (int p = 0, q = a + 1; p < copy_len && q < b; p++, q++) { array[p] = array[q]; printf("%c", array[p]); } // 字符串结束符只需要赋值一次 array[copy_len] = '\0'; } int main() { char str[] = "<h1>hello there i am programmer.</h1>"; parser(str); return 0; }
修复验证
运行修复后的代码,会正常输出hello there i am programmer.,无多余空格,修改str为其他符合标签格式的字符串也会正常输出标签包裹的内容。
内容的提问来源于stack exchange,提问作者Techy Bhoot
相关产品推荐
相关产品推荐

