C程序设计语言第二版习题2-4
来源:互联网
时间:2026-06-14 07:26:22
问题描述
先来看这个经典的字符串处理题:需要编写一个函数 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 索引重新写到数组前面),最后截断字符串。这样一轮下来,就剔除了一种字符。重复到黑名单遍历完毕,剩下的自然就是完全过滤后的字符串。