为什么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
相关产品推荐
相关产品推荐

