next up previous contents
Next: 6. 課題 18 Up: 18. 構造体 II Previous: 4. 構造体の配列

5. 標準関数 strcpy(), sscanf()

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


例 9
        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() が標準入力に対して行うのと同じ事を 文字列に対して行う。


例 10
        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() で、書式指定に "%d %d" を指定しているので、整数変数 p1 に、 整数 34 が、整数変数 p2 に整数 23 が代入されることになる。

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


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

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


例 11
    #include <stdio.h>
    #include <string.h>
    struct Test {
        char name[30];
        int zenki;
        int kouki;
    };
    main(){
        struct Test g[100]; /* 一応、100人分 */
        char buf[256];
        int  i=0, j;

        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);
        }
    }

上のプログラムでは、メンバー name[] が配列なので、 g[i].name はアドレスになっている点に注意しよう。従って、この部分だけは アドレス演算子 & がいらないのである。 また、データの名前と成績の間は1個の半角のスペースでなければならない。



Noriyo Kanayama 平成14年11月26日