K&Rを読もう(29) 問題2-4 tr -dみたいな。

夏休みだったので実家でゴロゴロしてました。休みぼけモードのtanakaです。

問題 2-4

問題の意図が掴みづらかった。

「文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1,s2)を書け」

どうやら、

% tr -d abc
% sed 's/[abc]//g'

みたいな処理をせよ。ということらしい。

#include <stdio.h>
#include <stdlib.h>

static void squeeze(char *str, const char *pat);

int main(void)
{
    char s1[] = "adbecf";

    squeeze(s1, "abc");
    puts(s1); /* def */

    return EXIT_SUCCESS;
}

static void squeeze(char *str, const char *pat)
{
    char *b = str;
    const char *p;

    for (; *str != '\0'; str++) {
        for (p = pat; *str != *p && *p != '\0'; p++)
            ;
        if (*p == '\0')
            *b++ = *str;
    }
    *b = '\0';
}

tr -dは結構便利かも。