演習 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; }