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

删除字符串中'e'字符的C代码遇空格输入时运行失败问题

问题:含空格字符串导致删除'e'的代码失效

这段代码用于删除字符串中所有'e'字符,输入不含空格的字符串时能正常运行,但输入包含空格的字符串时会运行失败。

原代码

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
    char  ch[20];
    int i,j;

     do{
        printf("Donner ch :");
        scanf("%s",&ch);
    }while(strlen(ch)<0);


    for(i=0;i<strlen (ch);++i)
    {
        if(ch[i] == 'e')
        {
            for(j=i;j<=strlen(ch)-1;j++)
                ch[j]=ch[j+1];


        }
    }

     printf("la chaine obtenue est %s", ch);
    return 0;
}

运行情况

  • 运行成功:输入不含空格的字符串(如helle),程序可正确删除所有'e'并输出处理后的结果。
  • 运行失败:输入包含空格的字符串时,程序仅处理空格前的部分内容,空格及后续字符被直接忽略,最终结果不符合预期。

问题原因及解决办法

核心问题

scanf("%s", &ch)的读取规则是:遇到空格、换行符或制表符就停止读取,因此无法获取包含空格的完整字符串,只会将空格前的片段存入数组ch,后续内容被丢弃,导致程序无法处理整串带空格的输入。

此外原代码还存在两个逻辑漏洞:

  1. 删除'e'后i直接自增,会跳过删除位置后的第一个字符(如连续的ee只会被删除一个);
  2. 循环中反复调用strlen(ch),重复计算字符串长度,降低运行效率。

修正方案

  1. 用fgets()替换scanf()读取整行输入,支持包含空格的字符串;
  2. 手动去除fgets()读取到的换行符,避免影响结果;
  3. 删除'e'后回退i并更新字符串长度,确保所有字符被检查;
  4. 提前缓存字符串长度,避免重复计算。

修正后的代码

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
    char ch[20];
    int i, j, len;

    do{
        printf("请输入字符串:");
        // 读取整行输入,最多读取19个字符(预留1位存字符串结束符)
        fgets(ch, sizeof(ch), stdin);
        len = strlen(ch);
        // 去除fgets读取到的换行符
        if(len > 0 && ch[len-1] == '\n'){
            ch[len-1] = '\0';
            len--;
        }
        // 修正原无效循环条件,改为判断输入是否为空
    }while(len == 0);

    len = strlen(ch); // 提前缓存初始长度
    for(i=0; i<len; ++i)
    {
        if(ch[i] == 'e')
        {
            // 前移字符覆盖'e'
            for(j=i; j<len; j++)
                ch[j] = ch[j+1];
            len--; // 字符串长度减1
            i--;   // 回退i,检查当前位置的新字符
        }
    }

    printf("处理后的字符串是:%s\n", ch);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:35:11