C语言移除字符串指定字符函数如何支持多单词输入
问题根因
你的字符移除逻辑本身可正常工作,无法支持多单词输入的核心问题出在输入读取环节:
scanf(" %s", b)的读取规则为遇到任意空白字符(空格、制表符、换行符)就终止读取,仅能获取第一个空格前的单段内容,无法读入包含空格的完整多单词字符串。- 原代码中存储输入和输出的字符数组长度仅为16字节,输入内容稍长就会触发缓冲区溢出,存在运行异常风险。
修改方案
- 替换字符串读取接口:使用
fgets()替代scanf("%s")读取整行输入,该接口会持续读取内容直到遇到换行符或达到预设的读取长度上限,可完整保留输入中的空格字符。 - 清理输入自带的换行符:
fgets()会将用户输入完成后按下回车产生的换行符\n一并存入字符数组,需要手动将该换行符替换为字符串结束符\0,避免最终输出时末尾多出多余空行。 - 适当放大字符缓冲区长度,适配常规长度的输入场景,避免缓冲区溢出。
- 保留
scanf(" %c", &r)中%c前的空格,该空格会自动跳过输入缓冲区中残留的空白字符,保证能正确读取到用户输入的待移除字符。
注意:不推荐使用
scanf("%[^\n]", b)的写法实现整行读取,该写法没有长度约束保护,极易触发缓冲区溢出,安全性远低于fgets()。
修改后完整可运行代码
#include <stdio.h> #include <string.h> void withoutString(char *new, char *base, char removee){ while(*base){ if(*base != removee){ *new++ = *base; } base++; } *new = '\0'; } int main() { // 放大缓冲区长度,预留足够空间存储常规输入 char b[1024], n[1024], r; printf("Please enter string: "); // 读取整行输入,最多读取sizeof(b)-1个字符,预留位置存储字符串结束符 fgets(b, sizeof(b), stdin); // 移除fgets自动读入的末尾换行符 b[strcspn(b, "\n")] = '\0'; printf("Which character do you want to remove? \n"); scanf(" %c", &r); withoutString(n, b, r); printf("The new string is %s\n", n); return 0; }
内容的提问来源于stack exchange,提问作者Kan Peljto
相关产品推荐
相关产品推荐

