課題 [11] ポインタ②(9/9)

問 9(提出プログラム名:ex1109a.c)
※上級クラスは必須(中級クラスはできる人だけでよい)
(いずれも加点対象)

このプログラム(ex1109a.c)をダウンロードし,この中の関数 expand を完成させなさい.

このプログラムは,最初に長さ 2 の char 配列 str を malloc を使ってメモリ確保し,そこに "a" という文字列を格納している('a' という文字とナル文字を直接代入している).
次に,整数 n を読み込み,
  str = expand(str);
n 回繰り返しながら,繰り返しのたびに str の内容を出力している.
str の内容は最初は "a" であるが,expand を呼び出すたびに 1 文字ずつ増え,"ab", "abc", "abcd", … と変化していく.

以下の仕様に従って,関数 expand を完成させなさい.
main の内容は変更しないこと.

[関数 expand] char *expand(char *p)
  p は拡張前の文字列(char 配列)を指すポインタ(その参照先が文字列)

  処理内容は以下の通り(手順②と④を実装せよ):
  ①文字列 p の長さを調べ,これを len とする.(実装済み
  ② p の指す char 配列の長さは(ナル文字の分があるので)len+1 であることから,
   別途,長さ len+2 の char 配列のメモリを malloc または calloc を使って確保する.
   そちらのポインタを q とする.

  ③ char 配列 q へ char 配列 p の内容をコピーする.(実装済み
  ④ p に格納されていた最後の文字を ch としたとき,q の末尾に「ch の次の文字」を追加する.
   ただし,ch'z' の場合は「次の文字」を 'a' とする.

   末尾にナル文字も追加する必要があるのを忘れないこと.
  ⑤ p の指す char 配列のメモリを解放する.(実装済み)
  ⑥ q を return する.(実装済み)

  • 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
繰り返し回数を入力してください:10
  1:[ab]
  2:[abc]
  3:[abcd]
  4:[abcde]
  5:[abcdef]
  6:[abcdefg]
  7:[abcdefgh]
  8:[abcdefghi]
  9:[abcdefghij]
 10:[abcdefghijk]
  • 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
繰り返し回数を入力してください:50
  1:[ab]
  2:[abc]
  ...
 49:[abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx]
 50:[abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy]

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 上の実行例と出力が違っていることを見落としている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


問 4 ~問 9 は 7/9(火)12:00 までに提出を済ませてください.※23:59 ではないので注意!
(ex1104a.c ~ ex1109a.c を Moodle から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.