C 언어 문자열과 정수 입력관련 질문
조회수 1749회
대학교와서 C 언어 공부 시작한지 얼마 안된 초짜입니다 책에 관련된 구조체를 정의해서 그와 관련된 정보들을 사용자로 부터 직접 입력받는 코드를 작성하는 문젠데요
typedef struct book{
char name[30];
char writer[30];
int length;
}Book;
int _tmain()
{
int i,j;
Book books[30];
for(i=0;i<3;i++)
{
fgets(books[i].name,30,stdin);
fgets(books[i].writer,30,stdin);
scanf("%d", &books[i].length);
}
for(i=0;i<3;i++)
{
printf("%s", books[i].name);
printf("%s", books[i].writer);
printf("%d", books[i].length);
}
return 0;
}
이렇게 해서
Yoon C programming 200 Hong C++ programming 250 James OS for programmer 300
이렇게 입력을 했는데...
Yoon C programming 200 Hong -85993...... 250 -85993......
요런식으로 되네요...ㅜㅜ정수입력하는 부분이 잘못된거 같은데 왜 이런걸까요
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
scanf 라는 함수의 특성때문에 그렇습니다.
scanf 함수는 일종의 버퍼를 사용하는데 해당 버퍼에 문자가 없을때만 입력을 받게 됩니다.
즉 scanf 로 인해 입력을 대기하는 상태에서 100 엔터를 치면 100 하고 개행문자 \n 까지도 버퍼에 들어갑니다.
결국 100은 구조체내의 length 필드에 저장이 되고 다음번 book 구조체 name 필드에 \n 이 들어가는 원치 않는 형태가 되는 겁니다.
이제 원인은 알았으니 해결방법을 생각해보죠. scanf 는 키 입력을 버퍼에 쌓는다 했으니 langth값을 받고 키보드 버퍼를 비워주면 될겁니다.
for(i=0;i<3;i++) { fgets(books[i].name,30,stdin); fgets(books[i].writer,30,stdin); scanf("%d", &books[i].length); getchar(); //의도적으로 한문자를 버퍼에서 비우던가 fflush(stdin); //버퍼를 비워버릴 수 있습니다. }
댓글 입력