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

スポンサーリンク

鍛錬 183

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

「文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に一行ずつ逆転するプログラムを書け」という問題です。
 
プログラム

以下は、入力した文字列を一時に一行ずつ逆転するプログラム kr_1_19.c です。

// include
#include <stdio.h>

// preprocessor
#define MAXLINE 1000

// prototype
int my_getline(char line[], int maxline);
void copy(char to[], char from[]);
void reverse(char s[]);

// main
int main(void)
{
	int len;
	int i;
	char line[MAXLINE];
	
	i = 1;
	while ((len = my_getline(line, MAXLINE)) > 0) {
		printf("----- %d 回目 -----\n", i);
		printf("入力行のテキスト = %s", line);
		
		// 文字列を逆順に変換
		reverse(line);
		
		printf("逆順に変換後 = %s", line);
		printf("\n\n");
		++i;
	}
	
	return 0;
}

// =====================================
// @brief      行を取得し,その長さを返す
// @param[in]  lim  入力行の最大長
// @param[out] s    取得した行
// @return     i -> 取得した行の長さ
// @note       無し
// =====================================
int my_getline(char s[], int lim)
{
	int c, i;
	
	for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
		s[i] = c;
	if (c == '\n') {
		s[i] = c;
		++i;
	}
	
	s[i] = '\0';
	
	return i;
}

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

// ================================================
// @brief         文字列を逆順に変換する
// @param[in/out] s  変換前の文字列/変換後の文字列
// @return        無し
// @note          改行コードも文字列として扱う
// ================================================
void reverse(char s[])
{
	char rev_line[MAXLINE];
	int len;
	int i, n;
	
	// 文字列長を確認
	len = 0;
	for (i = 0; i < MAXLINE - 1; ++i) {
		if (s[i] == '\0')
			break;
		++len;
	}
	
	// 文字列を逆順で格納
	for (i=len-1,n=0; i >= 0; --i,++n) {
		rev_line[n] = s[i];
	}
	rev_line[n] = '\0';
	
	// コピー
	copy(s, rev_line);
}

 
実行結果

以下は、プログラム kr_1_19.c を実行し、動作を確認しています。

※ 上記のプログラム kr_1_19.c では、改行コードも文字列として扱っているため、逆順に変換後は文字列の先頭に改行コードが配置されます。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_1_19.c -o kr_1_19
***@ubuntu:~/***/test/c$ ./kr_1_19
ABCDE
----- 1 回目 -----
入力行のテキスト = ABCDE
逆順に変換後 = 
EDCBA

AB
----- 2 回目 -----
入力行のテキスト = AB
逆順に変換後 = 
BA

ABCDEFGHIJKLMN
----- 3 回目 -----
入力行のテキスト = ABCDEFGHIJKLMN
逆順に変換後 = 
NMLKJIHGFEDCBA
タイトルとURLをコピーしました