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

为什么我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:15:01