반응형
#include<stdio.h>
int main(int argc, char *argv[])
{
int ID;
char name[10];
char grade;
printf("이름: ");
scanf("%s", name);
printf("학점: ");
scanf("%c", &grade);
printf("학번: ");
scanf("%d", &ID);
printf("%s(%d)의 학점: %c", name, ID, grade);
return 0;
}
위 코드를 실행하면 두 번째 호출되는 scanf가 무시되고 넘어간다.
이는 첫번째 입력 이후 버퍼에 \n이 남아있어 %c입력에서 \n이 들어가서 발생하는 문제이다.
이를 해결할 수 있는 방법에는 두 가지 방법이 존재한다.
1. 의미없는 입력 추가
#include<stdio.h>
int main(int argc, char *argv[])
{
int ID;
char name[10];
char grade;
printf("이름: ");
scanf("%s", name);
while (getchar() != '\n'); // 여기서 개행문자가 없어진다.
printf("학점: ");
scanf("%c", &grade);
printf("학번: ");
scanf("%d", &ID);
printf("%s(%d)의 학점: %c", name, ID, grade);
return 0;
}
코드를 보면, getchar함수를 호출하여 버퍼에 남아있는 개행 문자를 입력받는 것을 확인할 수 있다.
2. scanf의 수정
#include<stdio.h>
int main(int argc, char *argv[])
{
int ID;
char name[10];
char grade;
printf("이름: ");
scanf("%s", name);
printf("학점: ");
scanf(" %c", &grade); // 서식지정자 앞에 공백추가
printf("학번: ");
scanf("%d", &ID);
printf("%s(%d)의 학점: %c", name, ID, grade);
return 0;
}
두 번째 입력을 받는 scanf앞에 공백 한 칸을 추가해주면,
앞서 존재했던 모든 공백 문자를 무시하고 새로 입력을 받는다.
그 외(fflush함수를 호출해 입력 버퍼를 비우는 방법)
이 방법은 C표준이 아니다!
fflush함수는 출력 함수를 비우기 위해 설계된 함수이다.
#include<stdio.h>
int main(int argc, char *argv[])
{
int ID;
char name[10];
char grade;
printf("이름: ");
scanf("%s", name);
printf("학점: ");
fflush(stdin); // 동작안함.
scanf("%c", &grade);
printf("학번: ");
scanf("%d", &ID);
printf("%s(%d)의 학점: %c", name, ID, grade);
return 0;
}
Visual Studio 2013 이하의 버전에서만 fflush함수로 표준 입력 버퍼를 비울 수 있다고 한다.
따라서 위 코드는 항상 동작하지는 않는다.
반응형
'개념정리 > C' 카테고리의 다른 글
Visual Studio C4996 에러 처리 (0) | 2021.04.13 |
---|