標準関数 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個の半角のスペースでなければならない。