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

C语言段落字符删除方法及多行字符串处理程序调试求助

嘿,我来帮你搞定这两个问题!先从你的代码问题入手,再讲讲通用的多行字符串处理思路~

解决C语言多行字符串删除指定字符的问题

一、你的代码问题排查与修正

先拆解下你代码里的几个关键错误:

1. 输入处理的坑点

  • 你用了scanf("%[^;]s", inputString),这里格式符写错了:%[^;]已经表示读取所有字符直到遇到;,后面加s完全多余,而且这个调用会把输入缓冲区里的换行符留在原地。
  • 紧接着调用gets(inputString)会直接覆盖之前用scanf读取的内容,而且gets是C标准早就废弃的不安全函数(容易导致缓冲区溢出),绝对不能用。
  • 读取要删除的字符时,scanf("%c", &ch)会读取之前留在缓冲区的换行符,导致ch变成换行,根本不是你输入的目标字符。

2. 删除逻辑的错误

你的删除逻辑是:找到要删的字符时,把下一个字符放到输出字符串,然后i自增。这会导致两个问题:

  • 如果要删除的字符在字符串末尾,inputString[i+1]就是'\0',会提前截断输出。
  • 这种逻辑本质是“跳过当前字符并取下一个”,但正确的逻辑应该是不复制要删除的字符,其他字符正常保留。

修正后的代码

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

int main() {
    char inputString[1000], ch, outputString[1000];
    int i = 0, j = 0;

    printf("Enter a multi line string (press Ctrl+D on Linux/macOS or Ctrl+Z on Windows to end input):\n");
    // 用fgets循环读取多行,避免溢出,直到输入结束
    while (fgets(inputString + i, sizeof(inputString) - i, stdin) != NULL) {
        i += strlen(inputString + i);
        // 防止缓冲区满导致溢出
        if (i >= sizeof(inputString) - 1) {
            break;
        }
    }

    // 清除输入缓冲区的残留字符,避免读取到换行符
    while ((getchar()) != '\n');
    printf("Enter a letter to be removed:\n");
    scanf("%c", &ch);

    // 正确的删除逻辑:只复制非目标字符
    for (i = 0; inputString[i] != '\0'; i++) {
        if (inputString[i] != ch) {
            outputString[j++] = inputString[i];
        }
    }
    // 必须给字符串加结束符,否则会输出乱码
    outputString[j] = '\0';

    printf("Result:\n%s", outputString);
    return 0;
}

二、通用的多行字符串删除指定字符的方法

其实多行字符串本质就是包含'\n'的普通字符串,处理逻辑和单行完全一致,核心是正确读取多行输入和过滤指定字符:

  • 读取多行输入:
    • 优先用fgets循环读取,直到用户输入结束(比如Ctrl+D/Z),或者达到缓冲区上限。fgets会自动保留换行符,还能限制读取长度防止溢出,比scanf和gets安全得多。
  • 删除指定字符:
    • 方法一:用两个数组,遍历输入字符串,把不是目标字符的内容复制到输出数组,最后加'\0'。
    • 方法二:原地修改,用两个指针,一个遍历原字符串,一个记录新的位置,这样不需要额外的输出缓冲区(更节省内存)。

比如原地修改的精简版本:

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

int main() {
    char inputString[1000], ch;
    int i = 0, j = 0;

    printf("Enter a multi line string (press Ctrl+D/Z to end):\n");
    while (fgets(inputString + i, sizeof(inputString) - i, stdin) != NULL) {
        i += strlen(inputString + i);
        if (i >= sizeof(inputString) - 1) break;
    }

    while ((getchar()) != '\n');
    printf("Enter a letter to be removed:\n");
    scanf("%c", &ch);

    // 原地修改,无需额外数组
    for (i = 0; inputString[i] != '\0'; i++) {
        if (inputString[i] != ch) {
            inputString[j++] = inputString[i];
        }
    }
    inputString[j] = '\0';

    printf("Result:\n%s", inputString);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:58:15