fflush 함수
함수의 인자에 해당하는 입출력 버퍼를 지울 때 사용한다
내용을 입력하고 ENTER 를 입력할 때 '\n' 는 아래 그림처럼 버퍼에 남게 된다
이러한 경우를 없애기 위해서 fflush(stdin) 명령어를 사용한다
보통 반복문 끝에 사용한다
단, fflush 는 버퍼에 있는 데이터를 그냥 지우는 것이 아니라 출력하고자 하는 곳으로 전송한다
입력버퍼를 비우기 위해서는 버퍼에 있는 데이터를 읽어들이면 된다
void insert_line(LinkedListType *buffer) { int position; char line[MAX_CHAR_PER_LINE]; element p; printf("입력행번호를 입력하세요: \n"); scanf("%d", &position); printf("내용을 입력하세요: "); fflush(stdin); fgets(line, MAX_CHAR_PER_LINE, stdin); strcpy(p.a, line); add(buffer, position, p); display(buffer); }
위 코드는 내용을 입력받아 연결리스트에 삽입하는 함수이다
fflush(stdin) 을 이용하여 버퍼를 처리하면 결과는 다음과 같다
이러한 결과가 나타나는 이유는
fgets 함수가 버퍼에서 문자들을 읽어올 때 내용을 저장할 변수(sizeof(변수)) 의 크기만큼 문자를 읽는다
그 크기가 입력한 내용의 크기보다 작게 되면 입력한 내용의 중간에 NULL문자를 넣는다
그러면 버퍼에는 값들이 남아있기 때문에
다음에 fgets 함수는 그 값들을 읽어들이게 된다
이러한 경우를 해결하는 방법은 버퍼 안의 \n 을 읽을 때까지 데이터를 읽으면 된다
이는 while ( getchar() != '\n') 을 사용하면 가능하다
void insert_line(LinkedListType *buffer) { int position; char line[MAX_CHAR_PER_LINE]; element p; printf("입력행번호를 입력하세요: \n"); scanf("%d", &position); printf("내용을 입력하세요: "); fflush(stdin); while ( getchar() != '\n' ); //버퍼 안의 \n 까지 데이터를 읽는다 fgets(line, MAX_CHAR_PER_LINE, stdin); strcpy(p.a, line); add(buffer, position, p); display(buffer); }
단, 이 방법은 \n 이 버퍼에 남아있어도 버퍼를 비우지 않는 경우에는 효과를 보지 못하는 한계가 있다
상황에 따라 잘 사용하도록 하자
320x100
'Programming Language > C/C++' 카테고리의 다른 글
[C/C++] 빈칸을 포함한 문자열 입력 시 오류 해결 (0) | 2017.04.20 |
---|---|
[C/C++] strlen 함수, 문자열의 길이 (0) | 2017.04.20 |
[C/C++] 동적 메모리 할당 malloc (0) | 2017.02.27 |
[C/C++] 포인터 pointer (0) | 2017.02.26 |
[C/C++] 구조체 struct (0) | 2017.02.25 |