C语言字符串字符删除问题详解
先看一个经典的字符串处理题目:需要编写一个名为 squeeze(s1, s2) 的函数,其核心任务是从字符串 s1 中移除所有同样出现在 s2 中的字符。换句话说,s2 相当于一张“黑名单”,s1 中只要与黑名单上的字符匹配,就全部删除。

问题拆解与分析
整个实现需要分几个模块来搭建:
- 主函数 main:负责接收用户输入的字符串,并驱动整体处理流程。
- 自定义输入函数 get_line:注意此处不能直接使用书本上的
getline,因为标准库stdio.h中已存在同名函数,容易引发命名冲突。 - 核心函数 squeeze:真正执行逻辑的部分——从
s1中剔除s2里出现的所有字符。
代码实现与解析
下面是一份简洁的实现代码,逻辑直观清晰:外层循环遍历“黑名单”中的每个字符,内层循环逐个扫描目标字符串,将不匹配的字符向前移动,最后在末尾添加字符串结束符。
#include
#define LINE 1000
int get_line(char s[]);
int squeeze(char s[], char search[]);
int main()
{
char line[LINE];
char search[LINE]; //要过滤的字符串
int len;
printf("Type the search:");
get_line(search);
printf("Type the subject:");
while(len = get_line(line) > 0)
{
squeeze(line, search);
printf("The result is: %s ", line);
}
return 0;
}
//接收一行字符串
int get_line(char s[])
{
int i;
char c;
for(i = 0; i < LINE - 1 && (c = getchar()) != EOF && c != ''; i )
{
s[i] = c;
}
s[i] = '0';
return i;
}
/*
* 核心方法,从目标字符串移除指定字符
* 从subject中逐个剔除search中的字符
*/
int squeeze(char subject[], char search[])
{
int i, j, k;
char c;
k = 0;
while((c = search[k ]) != '0')
{ //逐个移除
for(i = j = 0; subject[i] != '0'; i )
{
if(subject[i] != c)
{
subject[j ] = subject[i];
}
}
subject[j] = '0';
}
return 0;
}
代码中 squeeze 函数采用了两层循环的设计,思路非常明确:每次取出黑名单中的一个字符,遍历当前 subject 的每一个字符,只要不等于该字符,就通过索引 j 重新写入数组前端进行保留,最后截断字符串。经过一轮操作,即剔除了一种字符。重复上述过程直到黑名单遍历完毕,剩余的就是经过完全过滤后的字符串。这种实现方式也是《C程序设计语言(第二版)》习题2-4的经典解法之一,适合初学者理解字符串过滤的核心逻辑。
