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
相关产品推荐
相关产品推荐

