プログラミング実習II (2026) 課題

[E8] 第7章 文字列

(E8_1)

キックオフ C 言語のソースコード 9.1 は標準関数 strlen と自作の関数 str_length で文字列の長さを求めている.

(E8_2)

キックオフ C 言語のソースコード 9.2 は,標準関数 strcpy,自作の関数 str_copystr_copy2 により,配列の文字列を別の配列にコピーする.

(補足)配列を引数として渡した場合,関数内での変更は呼び出し元の配列(main 内の buff など)にも反映されます.詳細は教科書8章「ポインタ」を参照してください.
(E8_3)

キックオフ C言語のソースコード 9.3 は,標準関数 strcat,自作の関数 str_concatstr_concat2 により,文字列を連結する.

(E8_4)

キックオフ C言語の 9.2.5項では, 文字列を比較する標準関数 strcmpと,自作の関数 str_compareが説明されている.strcmp を用いて,2個の文字列を辞書順に表示する関数 print_str を作成せよ.文字列が一致する場合は,それを1回のみ表示する.

さらに,関数 str_compare ではどのように文字列の比較が行われているか,レポートにて説明せよ( str_compare はプログラム内では用いない).

#include <stdio.h>
#include <string.h>

void print_str( char s1[], char s2[] ){
    // s1 と s2 を strcmp で比較して辞書順に表示
    // 一致する場合は1回のみ表示
}

int main( void )
{
    char a[] = "hanshin";
    char b[] = "japan";
    char c[] = "japanese";
    char d[] = "hankyu";
    char e[] = "japan";

    print_str( a, b );
    print_str( a, d );
    print_str( b, c );
    print_str( b, e );

    return 0;
}
(E8_5)

標準関数 fgets と自作関数 get_line を用いてキーボードから文字列を受け取り,入力された文字列の長さと表示の相違を観察し,レポートにて説明せよ.また,get_line での処理の内容も詳しく述べること.

#include <stdio.h>
#include <string.h>

#define N 256

void get_line(char buff[], int size)
{
	int i, c;
	for (i = 0; i < size - 1; i++) {
		c = getchar();
		if (c == EOF || c == '\n'){
			break;
		}
		buff[i] = c;
	}
	buff[i] = '\0';
}

int main(void)
{
	char str[ N ];
	printf("Enter a string:");
	fgets( str, sizeof(str), stdin );
	printf("str = %s, length = %d\n", str, (int)strlen(str));

	printf("Enter the same string again:");
	get_line( str, N );
	printf("str = %s, length = %d\n", str, (int)strlen(str));
	return 0;
}
(E8_6)

文字列を逆順にする関数 void str_reverse( char src[], char dst[] ) を作成し,実行結果を表示せよ.以前に作成した配列の要素を逆順にするプログラムが参考になるが,末尾の \0 の扱いに注意を要する.

表示例: (これは回文です)
Key in a string>> a Santa at Nasa
asaN ta atnaS a
#include <stdio.h>
#include <string.h>

#define M 128

void get_line( char buff[], int size )
{


}

void str_reverse( char src[], char dst[] ){


}

int main( void )
{
	char str[ M ] = "";
	char dst[ M ] = "";

	printf("Enter a string:");
	get_line( str, M );


	printf("%s \n", str);
	printf("%s \n", dst);

    return 0;
}
(E8_7)

標準関数を用いて単語当てゲームを作成せよ.正解 str と入力 inputstrcmp 等で比較し,ヒントとして「もっと前」または「もっと後ろ」を表示する.また,正解した場合は「正解」を表示する.

ただし,入力回数の上限を T = 10 回とし,あと何回の入力機会が残されているかについても,表示せよ.C 言語によるプログラミング p. 152,[リスト 4.12] の数当てゲームが参考になる.

表示例:
(入力が gakuin のとき)   "もっと後ろ.あと 9 回."
(入力が univ のとき)     "もっと前.あと 8 回."
(入力が kwata のとき)    "もっと前.あと 7 回."
(入力が kwansea のとき)  "もっと後ろ. あと 6 回."
(入力が kwansei のとき)  "正解"
#include <stdio.h>
#include <string.h>

#define M 128	// キーボードから入力される文字列の長さの上限
// #define T 10	// キーボードから文字列を受け取る回数の上限

void get_line( char buff[], int size )
{




}

int main( void )
{
	char str[] = "kwansei";		// 正解の文字列
	char input[ M ] = "";	// キーボードから入力される文字列

	printf("Enter a word  >>>");
	get_line( input, M );	// キーボードから i+1 番目の文字列入力


    return 0;
}
余力があれば,以下の機能を追加せよ. さらに,キーボードから入力された文字列の履歴を配列に格納しておき,最後にまとめて表示せよ. なお,文字列の間にはstrcat( str , " " ); によりスペースを入れること.
入力の履歴: gakuin univ kwata kwansea kwansei
さらに余力があれば,以下の機能も追加せよ. 正解でない場合は,その都度ヒントを出す.ヒントの出し方は各自工夫してよいが,レポートにてその内容を説明すること.
表示例(ヒントを追加した場合):
(入力が abc のとき)   "もっと後ろ.大きく外れています."
(入力が gakuin のとき)   "もっと後ろ.1文字もあっていません."
(入力が univ のとき)     "もっと前.1文字もあっていません."
(入力が kwata のとき)    "もっと前.最初の3文字は合っています"
(入力が kwansea のとき)  "もっと後ろ.最初の6文字は合っています"
(入力が kwansei のとき)  "正解"
入力の履歴: abc gakuin univ kwata kwansea kwansei
(E8_8*)

次の手順に沿ってプログラムを作成せよ.設問(1)~(3)がすべてできない場合でも,部分点を与える可能性があるため, 解けた問題まで提出するとよい(その場合,どの問題まで解いたかを考察欄に明記し, その問題のプログラムを提出せよ).

(1) 下のように初期化した文字列 sentence と, キーボードから受け取った文字列 str に対し, sentencestr で始まっているかどうか (strsentence の先頭から一致するかどうか)を判定して, その結果を表示するプログラムを作成せよ. sentence の方が str より長いと仮定してよい.設問(2)以降の都合で,ファイル名は (課題番号)_1.c とすること.

次を確認せよ.
 This → 始まっている
 That → 始まっていない
 Th → 始まっている
 Thise → 始まっていない

(2) 設問(1)の sentencestr に対し,sentence 中に str が出現するかどうかを判定して表示するプログラムを作成せよ.ファイル名は (課題番号)_2.c とする.

次を確認せよ.
  "This" → 含まれている
  "en." → 含まれている
  "apple" → 含まれている
  "is is" → 含まれている
  "banana" → 含まれていない
  "pencil" → 含まれていない

(3) 下のように初期化された文字列 sentence と, キーボードから受け取った文字列 str に対し, strsentence 内に出現するかどうかを判定するプログラム(ファイル名は (課題番号)_3.c とする)を作成せよ. ただし,次の条件を満たすようにせよ.

(例えば,"school" は 38~43 文字目, 266~271 文字目に出現している.)
 (注) 以下の文は2020年度以前に書かれたものである
char sentence[] = "Kwansei Gakuin University has eleven schools: \
theology, humanities, sociology, law & politics, economics, \
business administration, human welfare studies, international studies, \
education, science & technology, and policy studies. \
One of the characteristics of each school is the freshmen seminar \
organized with a small group of students. This embodies the policy of \
the small group education at university. Another practice is the \
integrated courses, which involve students taking courses outside \
their own majors. The Freshmen seminar aims for face-to-face \
communication between students and professors and the integrated \
courses aim to give students a multidimensional set of viewpoints. ";

※ 上記の sentence の初期化コードの行末の \ は「次の行への継続」を表すので,このまま使用すればよい. プログラム中にこれをコピーする際に, 2 行目の先頭の theology, 3 行目の先頭の business … の前にスペースや タブを入れないこと. (文字数が狂って下の動作確認の結果が一致しなくなる.)

※「文字列の大文字と小文字を区別しない比較」は,2つの文字列中の大文字を 全て小文字に変換し, それから比較を行うのが一方法. この場合,大文字を小文字に変換する関数 str_lcopy を作成することが考えられる.

※ 次を確認せよ