練習 [12] ポインタ②(4/5)

練習 4(提出プログラム名:p1204.c)

まず,このプログラム(p1204.c)をダウンロードしなさい.
p1204.c では,英単語を繰り返し読み込みながら文字列(char 配列)str末尾につなげていき,最後に(つながった)内容を 1 つの printf でまとめて出力させようとしている.
ただし,単語と単語の間には区切り文字として "|" も入れることにする(実行例を参照).

ダウンロードした p1204.c は未完成の状態であり,1 個の英単語を読み込んだらそれを "|" で囲んで出力するだけになっている(例えば,"good" と入力すると "|good|" と出力されるだけである).
講義で説明した strcat を利用し,複数の単語をつなげるように仕上げなさい

なお,入力の終わりは end という単語を入力した時とし,この end は文字列にはつなげない(出力しない)ものとする.入力された文字列が "end" に等しいかどうかのチェックには strcmp を使うこと.
ただし,この問題では "end" と入力される前に少なくとも1つは別の英単語が入力されるものと仮定してプログラムを作ってよい.

【注意】
char 配列 word の内容が "end" になっているかどうかをチェックするのに
  if ( word == "end" ) と書くのは誤り
なので,くれぐれも注意すること.(正しい方法は以下のヒントを参照)

【ヒント】
この場合,事前に何個の単語が入力されるか分からないため,いったん while(1){ ... で無限ループにしておいて,"end" が入力されたら break; で脱出するという方法をとるとよいです.
(例)
  strcpy(str, "|");  ←とりあえず最初の | だけは書き込んでおく.
  while (1)
  {
    word を読み込む;
    if ( strcmp(word, "end") == 0 ){ ←文字列の比較はこのように書く必要あり
     break;
    }
    wordstr の末尾に追加;
    "|"str の末尾に追加;
  }
  str を出力;

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
単語を 1 つ入力してください:ehime
単語を 1 つ入力してください:university
単語を 1 つ入力してください:computer
単語を 1 つ入力してください:science
単語を 1 つ入力してください:end
str = |ehime|university|computer|science|
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
単語を 1 つ入力してください:ehime
単語を 1 つ入力してください:end
str = |ehime|

【過去にあったミス(減点となり,やり直しを命じられる)】
2 種類の実行例を確認せずに提出してしまっている.
 (例1)区切りの | が付いていない
 (例2)"end" が出力に含まれている.
strcmp の使い方を誤っていたり(== 0 を書き忘れ等),そもそも使っていなかったりする.
if ( strcmp("word", "str" ) == 0 ) と書いてしまっている.
 この場合,word は文字列を格納した char 配列であるはずなのに,
 " " で囲んでしまうとそのまま "word" という文字列になってしまう.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 練習5 (p1205.c) ]