演習 2-4

無職の間にK&Rを再読。演習問題の解答をさらす。解く順番は適当。

演習 2-4
文字列 s2 中の任意の文字に等しい文字を s1 から除去するような形の squeeze(s1, s2) を書け。


Exercise 2-4
Write an alternste version of squeeze(s1, s2) that deletes each character in s1 that matches any character in the string s2.


問題を読み間違えて、一致する文字列を削除するプログラムを作ってしまった。原書を見て間違いに気づく。せっかくなんでついでのさらしておく。

#include <stdio.h>

/* Answer */
void squeeze(char s1[], const char s2[])
{
  int i, j, k;

  for (i = j = 0; s1[i] != '\0'; i++) {
    for (k = 0; s2[k] != s1[i] && s2[k] != '\0'; k++)
      ;
    if (s2[k] == '\0') s1[j++] = s1[i];
  }
  s1[j] = '\0';
}


int main(void)
{
  char s1[] = "BRIAN W.KERNIGHAN / DENNIS M.RITCHE";

  printf("[%s]\n", s1);

  squeeze(s1, "IRT/S");
  printf("[%s]\n", s1);

  return 0;
}


一致する文字列を削除するバージョン
(2008.02.21: 最初に掲載したものは間違っていたので訂正)

void squeeze(char s1[], const char s2[])
{
  int i, j, k;
  int buf;

  for (i = j = 0; s1[i] != '\0'; ) {
    for (buf = i, k = 0; s1[i] != '\0' && s2[k] != '\0', s1[i] == s2[k]; i++, k++)
      ;
    if (s2[k] != '\0') i = buf;
    s1[j++] = s1[i++];
  }
  s1[j] = '\0';
  return;
}