Previous: 構造体の配列
Up: 構造体 II
Next: 復習
Previous Page: 構造体の配列
Next Page: 復習

標準関数 strcpy(), sscanf()

標準関数 strcpy() は、文字列をコピーする関数である。

例8
        char str1[50];
        char str2[50];
        ...
        strcpy( str1, "kanayama");
        strcpy( str2, str1);

この例では、配列 str[] に文字列 "kanayama" がコピーされる。 更に、次の行で、 str1 から str2 へのコピーを行っているが、 str1 には、その前のコピーで、 "kanayama" がコピーされているので、 結局、 str2 にも "kanayama" がコピーされる。

但し、 strcpy() は、文字数などは数えないので、コピーされる配列は十分な 大きさを自分で注意して確保しなければならない。

また、ファイルの先頭に、 #include <string.h> を追加して置かなければ ならない。

 

標準関数 sscanf() は、文字列を指定した書式に従って、指定した変数に 読み込む関数である。従って、 scanf() が標準入力に対して行うのと同じ事を 文字列に対して行う。

例9
        char buf[256];
        int  p1, p2;

gets(buf); sscanf(buf, "%d %d", &p1, &p2 );

この例では、標準入力から文字列として、 buf[] にまず読み込む。 この時、例えば、 34 23 と入力されたとしよう。すると、配列 buf に、0番目から順に、'3','4',' ','2','3' と文字として入っている訳である。 即ち、文字列としては、"34 23" として入っている。これを、 sscanf() で、書式指定に { "整数 34 が、整数変数 p2 に整数 23 が代入されることになる。

従って、先の学生の成績ならば、次のようなデータがあったとき、

kanayama 70 65
yamada 80 90
hokusei 60 60
suzuki 65 70

次のプログラムで、名前、前期の成績、後期の成績として読み込むことが出来る。

例10
    main(){
        struct Test {
            char name[30];
            int zenki;
            int kouki;
        };
        struct Test g[100]; /* 一応、100人分 */
        char buf[256];
        int  i=0;

while (gets(buf)!=NULL){ sscanf( buf, "%s %d %d", g[i].name, &g[i].zenki, &g[i].kouki); i++; }

for (j=0; j<i; j++){ printf("%s, %d, %d\n", g[j].name, g[j].zenki, g[j].kouki); } }

但し、データの名前と成績の間は1個の半角のスペースでなければならない。

課題18

cd c を実行した後で( /c に移動した後で )、以下の課題を やってみよ。

課題 18.1
構造体の中の構造体 I

構造体 Point は、以下の通りである。

struct Point {
        int x;
        int y;
    };

この構造体をメンバーに持つ構造体 sankaku を作成せよ。 但し、構造体 sankaku は、三角形の3つの頂点座標をメンバーに持つ構造体 である。

課題 18.2
構造体の中の構造体 II

課題 18.1 の宣言を用いて、三角形の面積を計算せよ。 但し、三角形の面積 S は、 3つの頂点の座標を (x_1, y_1), (x_2, y_2), (x_3, y_3) とした場合、次の式で計算される。 <pre> S = | (x_3 - x_1) (y_2 - y_1) - (x_2 - x_1) (y_3 - y_1)| / 2 </pre>

3頂点には、 (1,1), (5,3), (4,2) を用いよ。

課題 18.3
構造体型の配列 I

例10を実行して見よ。

課題 18.4
構造体型の配列

課題 17.4 を改造し、一度に100人までの通年成績をつけられるようにせよ。 但し、課題 18.3 のように、構造体型の配列を使うと共に、データは、 次のようなものであるとする。

kanayama 940101 keijo 1 70 65 25
yamada 930102 eijo 3 80 90 30
hokusei 940103 keijo 2 80 60 15
suzuki 940211 keijo 1 65 70 10

データは、前から順に、名前、学籍番号、学科、組、前期成績、後期成績、出席回数 の7個である。

出力は、名前、学籍番号、通年成績の順で、1人1行の形式で出力するようにせよ。

 

作成したプログラムをメイルで金山まで送りなさい。題は、kadai18 とする事。

maruyama@wakhok.ac.jp
1995年02月08日 (水) 18時57分57秒 JST