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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:18:16