다음 글에서 소개된 문제 상황에 대한 해결책을 작성했습니다.
2022.01.30 - [Coding/자료구조(with C)] - scanf 의 원리 및 오류 상황에 대한 이해 (1)
scanf 의 원리 및 오류 상황에 대한 이해 (1)
# Result 문자열을 입력하세요 : hello tesla 입력한 문자열 : hello 문자열을 입력하세요 : 입력한 문자열 : tesla 이런 오류들에 대한 설명글이므로 열심히 읽어보시길 바랍니다. //오류가 나는 scanf #inclu
semi531.tistory.com
// 첫번째 해결책 (별로 추천하지는 않음)
// 주의할 점은 visual studio 에서 실행(ms 계열) 으로 컴파일 해야한다.
// 이게 무슨 말인지 모르면 그냥 늘 하던대로 하면된다.
// gcc 에서는 정상적으로 작동하지 않는 위험한 코드이다.
#include <stdio.h>
int main()
{
int num;
char c;
printf("숫자를 입력하세요 : ");
scanf("%d", &num);
fflush(stdin);
printf("문자를 입력하세요 : ");
scanf("%c", &c);
return 0;
}
이를 실행하면 성공적으로 되는데 위에서 새로 추가된 부분이 바로 아래의 부분이다.
fflush(stdin);
이 부분이 하는 역할은 stdin 을 비워버리라는 의미이다. 다시 말해 stdin 에 있는 모든 데이터들을 날려버리게 되는 것이다. 따라서 버퍼가 완전히 비워지게 된다. 즉 버퍼에 남아있던 \n 이 사라지게 된다. 이 이후 scanf 를 실행하면 버퍼를 다 날려줬으므로 정상적으로 실행된다. 하지만 gcc 같은 데에서는 이러한 작업을 하지 않을 가능성이 매우 크다. 따라서 그냥 간단한 코드 수행 측면에서는 원활하게 사용되지만 그다지 권장하지는 않는다. 그냥 간단하게 과제 제출용이라고만 생각하자.
다음 해결법을 확인해보자.

위의 코드를 보면 우리는 첫번째 scanf 뒤에 getchar() 함수를 호출했다. 이 함수의 역할은 stdin 에서 한 문자를 읽어와서 그 값을 리턴한다는 함수이다. 따라서 이 함수를 호출하면 stdin 에 남아있는 공백인 \n 을 가져오므로 stdin 을 비울 수 있다. 만약 우리가 ch = getchar(); printf("%c", ch); 를 했다면 화면상에 한칸 엔터가 쳐진 것이 출력될 것이다. 이제 버퍼가 비워진 상태로 scanf 를 해주므로 오류가 발생하지 않는다. 하지만 처음 입력할 때 만약 123abc 를 입력하면 오류가 생길 것이다. 왜냐 scanf("%d", &num); 을 했기 때문. %d 이므로 숫자까지만 받고 숫자 이외의 공백이나 문자가 들어오면 멈출 것이므로 결과는 아래와 같게 나온다. 입력하는 형식도 잘 맞춰서 코드를 작성하도록 하자.
숫자를 입력하시오 : 123abc
문자를 입력하시오 : 입력한 문자 : b
| 문자열 리터럴에 대한 이해 (c언어) (0) | 2022.01.30 |
|---|---|
| scanf 의 원리 및 오류 상황에 대한 이해 (1) (0) | 2022.01.30 |
| c 언어 " " 와 ' ' 의 차이점 및 문자열 (0) | 2022.01.27 |
| 함수 포인터 설명 (0) | 2022.01.27 |
| 포인터 swap (**pa, **pb) (0) | 2022.01.26 |
댓글 영역