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

C语言移除字符串空格仅输出空格前内容如何解决

问题根因

原代码跑不出预期结果的核心问题是复用源字符串的遍历索引i当目标字符串的写入下标:

  1. 遍历到空格位置时直接执行continue,目标字符串对应i的位置根本没赋值,保留了栈上的随机值,这个位置刚好是\0(字符串结束符)的概率极高,printf碰到结束符就直接终止输出,自然只能打出空格前的"hello"
  2. 就算这个位置没随机到结束符,空格后面的字符也全部错位了一个位置,输出肯定不对
  3. 代码从头到尾没给目标字符串补字符串结束符\0,本身就带乱码隐患
修正方案

给目标字符串单独维护一个独立的写入下标计数器,只有真的往里面写非空格字符的时候,才把这个下标往后挪一位,整个源串遍历完之后,手动在最后补个\0就行。
修正后的可运行代码:

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

int main()
{
    char test1[] = "hello man";
    char test2[128];
    int write_idx = 0; // 目标字符串专用的写入位置标记
    for (int i = 0; i < strlen(test1); i++)
    {
        if (test1[i] == ' ')
        {
            continue; // 碰到空格只跳过源串的当前字符,写入位置不动
        }
        test2[write_idx] = test1[i];
        write_idx++; // 写完一个字符,写入位置往后挪一位
    }
    test2[write_idx] = '\0'; // 这步不能省,必须手动补字符串结束标记
    printf("%s\n", test2);
    return 0;
}

编译运行就能正确输出helloman。

踩坑提醒
  • 凡是对字符串做增、删字符的操作,都别把源串的遍历索引直接拿来给目标串用,两个串长度不一样的时候,下标错位是必然的
  • C语言里的局部字符数组不会自动初始化,也不会在你拷贝完字符后自动补结束符,但凡手动拼字符串,最后一定要加\0,不然打印的时候会顺着内存一直往后读,带出一堆没意义的乱码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:18:23