問11 次の C プログラムの説明及びプログラムを読んで, 設問 1,2 に答えよ。
〔プログラムの説明〕
関数 wordwrap は,単語が行末で切れないように英文を出力する。
(1) 関数 wordwrap の引数は,英文が格納された入力文字列の配列 str[]と, 出力する 1 行の最大文字数 max(ただし,改行文字を含まない)である。
(2) 入力文字列中の単語は,1 文字の空白文字で区切られている。入力文字列の 先頭と最後に空白文字はない。
(3) 単語の途中で 1 行の最大文字数を超える場合は,その単語が次の行の先頭に なるように出力する。
(4) 単語の最大長を wx,入力文字列の長さを sx とすると, 0 < wx < 16 ≦ max < sx < 1024 の関係が成り立つものとする。
〔プログラム〕
(行番号) 01 #include <stdio.h> 02 #include <string.h> 03 #define BUFFMAX 1024 04 #define WORDMAX 16 05 06 void wordwrap(char str[], int max) 07 { 08 char word[BUFFMAX / 2][WORDMAX], buff[BUFFMAX]; 09 int leng[BUFFMAX / 2], i, idx, cnt, pos; 10 /*** 文字列を単語に分解する ***/ 11 i = idx = cnt = 0; 12 while (str[i] != '\0') { 13 if (str[i] == ' ') { 14 word[idx][cnt] = '\0'; 15 leng[idx] = cnt; 16 idx++; 17 cnt = 0; 18 } 19 else { 20 word[idx][cnt] = str[i]; 21 cnt++; 22 } 23 i++; 24 } 25 word[idx][cnt] = str[i]; 26 leng[idx] = cnt; 27 /*** 出力する ***/ 28 i = pos = 0; 29 while (i <= idx) { 30 if ((pos + leng[i]) > max) { 31 buff[pos-1] = '\0'; 32 printf("%s\n", buff); 33 pos = 0; 34 } 35 strcpy(&buff[pos], word[i]); 36 pos += leng[i]; 37 buff[pos] = ' '; 38 pos++; 39 i++; 40 } 41 buff[pos-1] = '\0'; 42 printf("%s\n", buff); 43 }
入力文字列と 1 行の最大文字数が次の値のとき,21 行目は 回実行される。また, プログラムが終了したときの変数 pos の値は である。
入力文字列:
AAAA△BBBBB△CCC△DDDD△EEE△FFF\0
1 行の最大文字数: 18
解答群
ア 5 イ 7 ウ 8 エ 12 オ 13
カ 15 キ 16 ク 22 ケ 27
設問2 次の記述中の に入れる正しい答えを, 解答群の中から選べ。
入力文字列の先頭の空白文字はそのまま出力するように,最初の単語に先頭の 空白文字列を含め,また単語間の空白文字が何文字あっても,1 文字にするように プログラムを修正する。
そのためには,αを12 行目の直前に,βを18 行目の直前に挿入すればよい。
α
β
ア cnt++ イ cnt-- ウ i エ i++ オ i--
カ i+1 キ i-1 ク idx++ ケ idx--