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); //버퍼를 비워버릴 수 있습니다. 
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)