해결된 질문
작성
·
856
0
수고많으십니다. 제목대로 입력 버퍼의 초기화에 대해서 궁금증이 있어 질문 올립니다.
#include <stdio.h>
int pow(int base, int exp);
int main()
{
int base, exp, q = 2;
while (q == 2)
{
printf("Base and Exp : ");
q = scanf("%d %d", &base, &exp);
if (q != 2)
{
printf("Worng enter\n\n");
rewind(stdin);
//while (getchar() != '\n');
q = 2;
continue;
}
printf("%d exp %d : %d\n\n", base, exp, pow(base, exp));
}
return 0;
}
int pow(int base, int exp)
{
int result = 1;
for (int i = 0; i < exp; ++i)
result *= base;
return result;
}
이번 강의의 예제를 나름대로 만들어 보았습니다. 저는 입력 버퍼로 인한 오류를 많이 격어서 입력 버퍼를 초기화하는 방법을 찾아보다 rewind(stdin);를 발견하여 사용했습니다. 그런대 강의 커뮤니티의 질문들을 살펴보니 대다수가 버퍼 초기화에 while (getchar() != '\n');를 사용하고 있었습니다. (참고로 전 아직 이 강의까지만 수강했습니다.)
요점은 rewind(stdin); 와 while (getchar() != '\n'); 의 기능적인 차이가 있는지, rewind(stdin);을 사용할때 위험성이 있는지 알고 싶습니다. 답변 부탁드립니다.
답변 2
1
좋은 시도입니다.
원칙만 보면 getchar() 버퍼에서 꺼내서 읽는 것이고 rewind()는 버퍼는 그냥 두고 처음으로 돌아가는 것입니다.
생각해보니 요즘은 음악 듣는 카세트 테이프가 멸종되어서 모르실 수도 있을텐데 처음으로 되돌려서 듣는 버튼이 rewind()입니다. 예전에는 카세트 테이프에 파일을 저장하던 시대도 있었습니다.
rewind()는 원래 파일 사용을 기준으로 만들어진 것입니다. 버퍼에서는 데이터를 꺼내면 데이터가 사라지지만 (보다 정확히는 사라지도록 구현되어 있지만) 파일에서는 데이터를 읽어도 (다른 곳에서 파일을 지우지 않았다면) 파일이 남아있기 때문에 되감아서 다시 읽을 수 있는 것입니다.
stdin에 대해서 원칙대로 작동할런지는 일단 검색해서는 찾아보지를 못했습니다. stdin 호환성에 대해서는 표준 문서를 자세히 찾아봐야 할 것 같습니다. 현재로서는 rewind()를 버퍼 비우는 용도로 사용해도 안정적이다라는 증거는 못찾겠네요.
[참고1]
https://stackoverflow.com/questions/31651144/how-to-tell-getchar-to-go-back-to-the-beginning-of-the-buffer
with a file on disk, you could use rewind() to read it again. But your standard input is not a file, just a stream. If you want to process input from the user (or, from a pipe) multiple times, you have to store it yourself. – user2371524 Jul 27 '15 at 10:59
[참고2]
https://en.cppreference.com/w/c/io/rewind
0