K&R 演習2-4 解答 (プログラミング言語C 第2版)

スポンサーリンク

鍛錬 304

K&R 演習2-4 解答 (プログラミング言語C 第2版)

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

B.W.カーニハン D.M.リッチー 石田晴久 訳 『プログラミング言語C 第2版 ANSI 規格準拠』, (共立出版, 2017), pp.59.

スポンサーリンク

プログラム

以下は、文字列 s2 中のいずれかの文字に等しい文字を s1 から除去するプログラム、kr_2_4.c です。

文字列 s1 と s2 については、次の文字列を指定しています。

s1:AYA_BYB*CYC-DYD+EYE
s2:ABC

// include
#include <stdio.h>

// preprocessor
#define MAX_LINE 256  // 格納可能な文字列の最大長

// prototype
void squeeze(char s1[], char s2[]);
void copy(char from[], char to[]);

// main
int main(void)
{
	char s1[MAX_LINE] = "AYA_BYB*CYC-DYD+EYE";
	char s2[MAX_LINE] = "ABC";
	
	printf("除去前:%s\n", s1);
	squeeze(s1, s2);
	printf("除去後:%s\n", s1);
	
	return 0;
}

// ========================================================================
// @brief          文字列s2中のいずれかの文字に等しい文字を,s1から除去する
// @param[in/out]  s1  被チェック文字列
// @param[in]      s2  除去文字列
// @return         無し
// @note           無し
// ========================================================================
void squeeze(char s1[], char s2[])
{
	char tmp[MAX_LINE] = "";
	int tmp_count;
	int s2_count;
	int i;
	
	tmp_count = 0;
	s2_count = 0;
	
	for (i = 0; s2[s2_count] != '\0'; i++) {
		// 除去対象文字に一致しない場合
		if (s1[i] != s2[s2_count]) {
			// 被チェック文字列が終端の場合
			if (s1[i] == '\0') {
				tmp[tmp_count] = '\0';
				copy(tmp, s1);
				s2_count++;
				tmp_count = 0;
				i = 0;
				i--;
			}
			else {
				tmp[tmp_count++] = s1[i];
			}
		}
	}
}

// ===================================
// @brief      文字列をコピーする
// @param[in]  from  コピー元の文字列
// @param[out] to    コピー先の文字列
// @return     無し
// @note       無し
// ===================================
void copy(char from[], char to[])
{
	int i;
	
	i = 0;
	while ((to[i] = from[i]) != '\0')
		i++;
}
スポンサーリンク

実行結果

以下は、プログラム kr_2_4.c を実行して、文字列 s2 中のいずれかの文字に等しい文字を s1 から除去しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_2_4.c -o kr_2_4
***@ubuntu:~/***/test/c$ ./kr_2_4
除去前:AYA_BYB*CYC-DYD+EYE
除去後:Y_Y*Y-DYD+EYE
タイトルとURLをコピーしました