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

スポンサーリンク

鍛錬 500

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

s における t の最も右側の出現位置を返す関数 strrindex(s,t) を書け。

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

スポンサーリンク

プログラム

以下は、文字列 s における t の最も右側の出現位置を返すプログラム、kr_4_1.c です。

今回は、検索するパターンを ABC に設定しています。

// include
#include <stdio.h>

// preprocessor
#define MAXLINE 1000	// 入力行の最大長

// prototype
int my_getline(char s[], int lim);
int strrindex(char s[], char t[]);

// global
char pattern[] = "ABC";	// 探索するパターン

// main
int main(void)
{
	char line[MAXLINE];
	int found = 0;
	int pattern_right;
	
	while (my_getline(line, MAXLINE) > 0) {
		if ((pattern_right = strrindex(line, pattern)) >= 0) {
			printf("-------------------------------\n");
			printf("入力行\n");
			printf("%s", line);
			printf("|||||||||||||||||||||||||||||||\n");
			printf("0123456789012345678901234567890\n");
			printf("0         1         2         3\n");
			printf("-------------------------------\n");
			printf("パターン %s の最も右側の出現位置\n", pattern);
			printf("s[%d]\n", pattern_right);
			printf("-------------------------------\n");
			printf("\n");
			found++;
		}
	}
	
	return found;
}

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

// ================================================
// @brief     sにおけるtの最も右側の出現位置を返す
// @param[in] s  入力行
// @param[in] t  パターン
// @return    j  -> sにおけるtの最も右側の出現位置
// @return    -1 -> 文字列中にパターンが存在しない
// @note      無し
// ================================================
int strrindex(char s[], char t[])
{
	int i, j, k;
	
	for (i = 0; s[i] != '\0'; i++) {
		for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++) {
			;
		}
		if (k > 0 && t[k] == '\0') {
			j--;
			return j;
		}
	}
	
	return -1;
}
スポンサーリンク

実行結果

以下は、プログラム kr_4_1.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_4_1.c -o kr_4_1
***@ubuntu:~/***/test/c$ ./kr_4_1
wwwABCiii
-------------------------------
入力行
wwwABCiii
|||||||||||||||||||||||||||||||
0123456789012345678901234567890
0         1         2         3
-------------------------------
パターン ABC の最も右側の出現位置
s[5]
-------------------------------

ABCiii
-------------------------------
入力行
ABCiii
|||||||||||||||||||||||||||||||
0123456789012345678901234567890
0         1         2         3
-------------------------------
パターン ABC の最も右側の出現位置
s[2]
-------------------------------

wwwwwwwwwwABCiiiiiiiiii
-------------------------------
入力行
wwwwwwwwwwABCiiiiiiiiii
|||||||||||||||||||||||||||||||
0123456789012345678901234567890
0         1         2         3
-------------------------------
パターン ABC の最も右側の出現位置
s[12]
-------------------------------
タイトルとURLをコピーしました