首页 > 教程攻略 > ai教程 >C程序设计语言第二版习题2-4

C程序设计语言第二版习题2-4

来源:互联网 时间:2026-06-14 07:26:22

问题描述

先来看这个经典的字符串处理题:需要编写一个函数 squeeze(s1, s2),它的任务是从字符串 s1 中把那些同样出现在 s2 里的字符全部删掉。换句话说,s2 就像一张“黑名单”,s1 中但凡跟名单上的字符对上的,统统不留。

C程序设计语言第二版习题2-4

问题拆分

整个实现需要分几块来搭:

  • 主函数 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 索引重新写到数组前面),最后截断字符串。这样一轮下来,就剔除了一种字符。重复到黑名单遍历完毕,剩下的自然就是完全过滤后的字符串。