自分用メモ

まだいろいろと再構成中。

タグ: fscanf_s

こういう構造体を作ってfscanf_sを使おうとする。
struct phone_type{
   char name[40];
   int areacode;
   char number[9];
} phone[MAX];

正解はこのように、
fscanf_s(fp, "%s%d%s", phone[loc].name, _countof(phone[loc].name), &phone[loc].areacode, phone[loc].number, _countof(phone[loc].number));

%s フォーマットの変数に対する要素数指定には_countof()を使ったりするけれど、
%d フォーマットの変数(&になる)に対する要素数指定は「なし」が正解。

fscanfを使おうとすると、「fscanf_sを使え」と怒られる件。

例えばグローバルでこういうの宣言して、

char names[100][40];
char numbers[100][40];


こういうのを作った時、

void load(void){
FILE *fp;
errno_t errno;

if ((errno = fopen_s(&fp, "phone", "r")) != 0){
printf("ファイルを開けない\n");
printf("%d", errno);
exit(1);
}

loc = 0;
while (!feof(fp)){
printf("%s%s", names[loc], numbers[loc]);
fscanf_s(fp, "%s%s", names[loc], 40, numbers[loc], 40);
loc++;
}
fclose(fp);
}


fscanf_sのパラメータで、各変数の後にその大きさ(赤字で書いたもの)を入れないと、コンパイルは通るが実行時エラーで落ちる。

*** fscanf_s だけでなく、gets_s / strcpy_s(これはコンパイルも通らない)も同様。

このページのトップヘ