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

C语言:不使用字符串库函数移除空格时程序无输出问题求助

你的字符串去空格程序无输出的问题分析与修复

我来帮你一步步排查代码里的问题,正是这些细节导致了程序没有输出甚至功能异常:

1. scanf 读取带空格字符串的局限性

你用 scanf("%s", &str1) 读取输入时,%s 格式符会在遇到空格、换行或制表符时立刻停止读取。也就是说,你输入带空格的字符串时,程序只能读到第一个空格前的内容,后面的部分根本没被存进 str1 里。另外,str1 本身就是数组名(本质是指针),不需要加 &,直接写 scanf("%s", str1) 即可,但要解决空格读取问题,更推荐用 fgets 替代。

2. 打印单个字符时的格式符错误

你在 removeSpaces 里写了 printf("%s", str2[i]),这是典型的格式不匹配:%s 是用来打印完整字符串的,而 str2[i] 是单个字符,应该用 %c。而且固定循环50次会打印大量未初始化的垃圾值,完全没必要。

3. 缺少字符串结束符

C语言里的字符串必须以 '\0' 结尾,你把非空格字符复制到 str2 后,没有添加这个结束符,就算后续打印逻辑正确,也会出现乱码或异常行为。

4. 不必要的固定循环范围

你遍历到 i < 50,但实际上应该遍历到原字符串的结束符 '\0' 为止,不然会处理数组里的无效垃圾数据。

5. 函数返回值未实现

你声明了 char *removeSpaces(char *inString),但函数里没有 return 语句,这会触发C语言的未定义行为。


修复后的完整代码

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

char *removeSpaces(char *inString);

int main() {
    char str1[50];
    printf("Enter a string : ");
    // 用fgets读取带空格的完整字符串
    fgets(str1, sizeof(str1), stdin);
    // 去掉fgets自动读入的换行符
    str1[strcspn(str1, "\n")] = '\0';
    
    removeSpaces(str1);
    return 0;
}

char *removeSpaces(char *inString) {
    char str2[50];
    int j = 0;
    // 只遍历到原字符串的有效内容结束
    for (int i = 0; inString[i] != '\0'; i++) {
        if (inString[i] != ' ') {
            str2[j] = inString[i];
            j++;
        }
    }
    // 必须添加字符串结束符
    str2[j] = '\0';
    
    // 直接打印完整字符串,不用循环单个字符
    printf("%s\n", str2);
    
    // 按函数声明返回指针(注:str2是局部变量,外部不可用,若需返回有效指针建议用动态分配)
    return NULL;
}

额外优化:原地修改字符串(节省内存)

如果不想额外创建 str2 数组,可以直接在原字符串上修改,更高效:

char *removeSpaces(char *inString) {
    int j = 0;
    for (int i = 0; inString[i] != '\0'; i++) {
        if (inString[i] != ' ') {
            inString[j] = inString[i];
            j++;
        }
    }
    inString[j] = '\0';
    printf("%s\n", inString);
    return inString;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:57:30