課題① 文字列のソート

ここでは,動的メモリ管理を用いて,キーボードからの入力を行単位で辞書順にソートして出力するプログラムを作成する.

 

サンプルコード

サンプルコードには,Sort関数以外の部分が記述してある.サンプルプログラムは P:\学部授業関連\2022年度前期\プログラミング演習II\課題2\strsort に置いてあるのでコピーして使用すること(strsort.c).

ReadLines関数の解説

ReadLines関数では,キーボードからの入力を buf[] に読み込んだ後に,文字列の長さにあわせたメモリ領域を malloc 関数で確保し,そのアドレスを,引数として渡された文字列を指すポインタの配列に順に格納している.

以下のような構文で,文字列の長さにあわせたメモリ空間を確保している.

    lines[cnt] = malloc(strlen(buf) + 1);

C言語における文字列は,ナル文字で終端する必要があるため,(文字数+1)バイトのメモリ領域が必要となる. 

3行入力した後のメモリの様子は,以下のようになっている.

ReadLines関数は,ファイルの終端(キーボードからの入力の場合には,Ctrl+Zが押されるまで)入力を繰り返す.

文字列をソートするには,lines の各要素の指している文字列どうしを比較し,各要素の値(ポインタ)を整列させればよい.文字列の比較には strcmp 関数が使用できる.

       課題内容: (1)Sort 関数を記述し,プログラムを完成させよ.
              (2)プログラムの終了前に可変長文字列を開放する関数を追加せよ.

 

実行例

banana
papaya
strawberry
mango
kiwi fruit
apple
^Z  <-  入力が終了したら Ctrl+Z を押す
----- 6 lines -----
apple
banana
kiwi fruit
mango
papaya
strawberry