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

为什么C语言去除字符串首尾空格程序调试时while循环未被执行

代码问题定位与修复方案

导致while循环不执行的核心错误

你的代码中两个while循环的判断条件存在类型不匹配问题,这是循环完全不运行的直接原因:

  • C语言中双引号" "代表字符串字面量,实际参与比较的值是该字符串在内存中的存储地址
  • c[i]、c[j]是char类型的单个字符,参与比较的值是字符对应的ASCII编码值
  • 拿单个字符的ASCII值和字符串的内存地址做比较,判断条件永远为假,因此两个while循环都不会触发
  • 修复方式:将双引号替换为单引号' ',单引号才代表char类型的空格字符

其他潜在运行错误

  • 输出数组未补结束符:遍历赋值完d数组后没有在末尾补充'\0'字符串结束符,直接输出会打印数组后续未初始化的垃圾内容
  • 格式化字符串风险:直接使用printf(d)存在格式化字符串注入风险,如果d中包含%s、%d等格式化占位符会触发程序异常,建议改为printf("%s", d)
  • 边界逻辑缺失:没有处理输入全为空格的场景,这种情况下第一个循环结束后i会大于j,后续for循环会出现逻辑异常
  • 不安全的输入函数:gets函数已被C标准废弃,该函数不做缓冲区长度校验,输入内容超过数组长度时会触发内存溢出,建议替换为fgets
  • 非标准main函数写法:void main不是C标准规定的main函数签名,标准写法为int main(),执行结束需要返回0表示正常退出
  • 冗余头文件:代码没有用到malloc.h、stdlib.h中的功能,可直接删除减少编译开销

修复后可正常运行的完整代码

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

int main()
{
    char c[1000], d[1000];
    // 替换gets为安全的fgets
    fgets(c, sizeof(c), stdin);
    // 去除fgets读取到的末尾换行符
    int len = strlen(c);
    if (len > 0 && c[len-1] == '\n') {
        c[len-1] = '\0';
        len--;
    }

    int i = 0, j = len - 1;
    // 双引号改单引号,同时增加边界判断避免数组越界
    while (i < len && c[i] == ' ') {
        i++;
    }
    while (j >= i && c[j] == ' ') {
        j--;
    }

    int k, l = 0;
    for (k = i; k <= j; k++) {
        d[l] = c[k];
        l++;
    }
    // 补充字符串结束符
    d[l] = '\0';

    printf("%s", d);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:09:02