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

スポンサーリンク

鍛錬 336

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

改行文字やタブのような文字を目で見えるエスケープ文字\nや\tに変換しながら, s を t にコピーするような関数 escape(s,t) を書け。switch を使うこと。逆に,エスケープ系列を実際の文字に変換する関数も書いてみよ。

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

スポンサーリンク

変換する文字列

以下は、今回変換する文字列です。

改行(\n)を1つ、タブ(\t)を3つ含んでいます。

This is a pen.\nThis is a desk.\t\t\tThis is a book.
スポンサーリンク

プログラム

以下は、次の2つの関数を記述したプログラム kr_3_2.c です。

escape(s, t):
改行文字とタブを、目で見えるエスケープ文字に変換する。

rev_escape(t, s):
目で見えるエスケープ文字を、改行文字とタブに変換する。

// include
#include <stdio.h>

// prototype
void escape(char s[], char t[]);
void rev_escape(char t[], char s[]);

// main
int main(void)
{
	char s[512] = "This is a pen.\nThis is a desk.\t\t\tThis is a book.";
	char t[512] = "";
	
	// 改行文字とタブを,目で見えるエスケープ文字に変換
	printf("--------------------------------------------------------------\n");
	printf("変換前 = %s\n", s);
	printf("\n");
	escape(s, t);
	printf("変換後 = %s\n", t);
	printf("\n");
	
	// 目で見えるエスケープ文字を,実際の改行文字とタブに変換
	printf("--------------------------------------------------------------\n");
	printf("変換前 = %s\n", t);
	printf("\n");
	rev_escape(t, s);
	printf("変換後 = %s\n", s);
	printf("\n");
	
	return 0;
}

// ================================================================
// @brief      改行文字とタブを,目で見えるエスケープ文字に変換する
// @param[in]  s  変換前の文字列
// @param[out] t  変換後の文字列
// @return     無し
// @note       無し
// ================================================================
void escape(char s[], char t[])
{
	int i, n;
	
	n = 0;
	for (i = 0; s[i] != '\0'; i++) {
		t[n] = s[i];
		switch (t[n]) {
			case '\n':
				t[n] = '\\';
				n++;
				t[n] = 'n';
				break;
			case '\t':
				t[n] = '\\';
				n++;
				t[n] = 't';
				break;
		}
		n++;
	}
	t[n] = '\0';
}

// ================================================================
// @brief      目で見えるエスケープ文字を,改行文字とタブに変換する
// @param[in]  t  変換前の文字列
// @param[out] s  変換後の文字列
// @return     無し
// @note       無し
// ================================================================
void rev_escape(char t[], char s[])
{
	int i, n;
	
	n = 0;
	for (i = 0; t[i] != '\0'; i++) {
		s[n] = t[i];
		switch (s[n]) {
			case '\\':
				i++;
				n++;
				s[n] = t[i];
				switch (s[n]) {
					case 'n':
						n--;
						s[n] = '\n';
						break;
					case 't':
						n--;
						s[n] = '\t';
						break;
					default :
						break;
				}
		}
		n++;
	}
	s[n] = '\0';
}
スポンサーリンク

実行結果

以下は、kr_3_2.c を実行して、2つの関数 (escape(s, t), rev_escape(t, s)) による文字列の変換を確認しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_3_2.c -o kr_3_2
***@ubuntu:~/***/test/c$ ./kr_3_2
--------------------------------------------------------------
変換前 = This is a pen.
This is a desk.			This is a book.

変換後 = This is a pen.\nThis is a desk.\t\t\tThis is a book.

--------------------------------------------------------------
変換前 = This is a pen.\nThis is a desk.\t\t\tThis is a book.

変換後 = This is a pen.
This is a desk.			This is a book.
タイトルとURLをコピーしました