Translate

2017年11月4日土曜日

scanf で charを受け取る

char以外の文字を受け取りその後charを受け取る場合
以下のように書くと期待しない動きになる

#include 

int main() {
 int n;
 char a;
 char b;

 scanf("%d", &n);
 scanf("%c", &a);
 scanf("%c", &b);

 return 0;
}

scanfは、3回登場するが、入力は10とaの2回
10
a




最初の変数に10が代入。
改行はストリームに残っているので、char変数にaに代入される。
その後、改めて入力したaがchar変数bに代入される。

一度入力した後にcharに代入する場合、改行を毎回捨てる必要がある
①getchar()で読み捨てる
#include 

int main() {
 int n;
 char a;
 char b;

 scanf("%d", &n);
 (void)getchar();
 scanf("%c", &a);
 (void)getchar();
 scanf("%c", &b);

 return 0;
}


②書式文字列に半角スペースを先頭につけ、最初の改行を読み捨てる
#include 

int main() {
 int n;
 char a;
 char b;

 scanf("%d", &n);
 scanf(" %c", &a);
 scanf(" %c", &b);

 return 0;
}

③書式文字列に代入不可(*)を指定して読み飛ばす
#include 

int main() {
 int n;
 char a;
 char b;

 scanf("%d", &n);
 scanf("%*c%c", &a);
 scanf("%*c%c", &b);

 return 0;
}