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

C语言移除字符串所有空格时循环退出后仍打印多余文本问题

问题原因

你的代码存在两个核心C语言字符串操作错误,打印出多余字符是典型的未定义行为+字符串缺少结束符导致的:

  • char newStr[] = ""; 定义的数组长度仅为1字节,只能容纳1个字符串结束符\0。你后续循环中往newStr写入字符时,属于数组越界写操作,会直接覆盖栈上相邻内存存储的原字符串str的数据,属于C标准中明确的未定义行为,运行结果完全不可控。
  • 循环写入非空格字符后,没有在newStr的末尾手动添加字符串结束符\0。C语言中所有字符串都必须以\0作为结束标记,printf输出%s格式的字符串时,会从起始地址一直向后读取内存,直到碰到第一个\0才会停止,这就是输出末尾多出无关字符的直接原因。

你测试时发现的两种“可以正常运行”的情况都只是巧合,并没有从根本上解决问题:

  1. 预先给newStr设置足够大的固定长度时,只是避免了越界写覆盖其他内存的问题,如果忘记加结束符,依然可能打印出乱码;
  2. 把循环条件改成i<=strlen(str)时,最后一次循环会读取到原字符串末尾自带的\0,这个字符不是空格,会被写入newStr,刚好补上了缺失的结束符,但如果newStr空间不足,越界问题依然存在,只是刚好当前运行环境下没有触发崩溃而已。
修复后的正确代码
#include <stdio.h>
#include <string.h>

int main(){
    char str[] = "   My name is Harry   123 ";
    // 去空格后的字符串最长不会超过原字符串长度,额外+1字节用来存储结束符\0
    char newStr[strlen(str) + 1];
    int j = 0;
    for(int i = 0; i < strlen(str); i++){
        if(str[i] != ' '){
            newStr[j] = str[i];
            j++;
        }
    }
    newStr[j] = '\0'; // 必须手动添加字符串结束符
    printf("%s", newStr);
    return 0;
}

修复后运行输出为MynameisHarry123,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:27:18