删除字符串中'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,后续内容被丢弃,导致程序无法处理整串带空格的输入。
此外原代码还存在两个逻辑漏洞:
- 删除'e'后
i直接自增,会跳过删除位置后的第一个字符(如连续的ee只会被删除一个); - 循环中反复调用
strlen(ch),重复计算字符串长度,降低运行效率。
修正方案
- 用
fgets()替换scanf()读取整行输入,支持包含空格的字符串; - 手动去除
fgets()读取到的换行符,避免影响结果; - 删除'e'后回退
i并更新字符串长度,确保所有字符被检查; - 提前缓存字符串长度,避免重复计算。
修正后的代码
#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
相关产品推荐
相关产品推荐

