디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

어떡해 일기 #15 :: fflush(stdin)

어떡해갤로그로 이동합니다. 2009.12.22 22:05:35
조회 1491 추천 0 댓글 11


어떡해 일기는 제가 \'쓸만한 프로그래머\'가 되기까지의 하루하루를 기록해 나갈 것입니다.
이것은 제가 그날 하루동안 프로그래머가 되기 위해 노력한 사항과 에피소드를 만천하에 공개하여,
저 스스로 나태해지지 않도록 채찍질 하기 위함과 동시에 선배님들에게 조언을 구하고자 함입니다.
자유분방한 DC에서 올라가는 글인 만큼 그날의 기분에 따라 존칭, 돌연 막말 등 일관성 없는 말투가 있을 수 있습니다.

길다는 의견이 많아 앞으로는 되도록 일기를 짧게 쓰도록 합니다.
더 많은 형들과 이야기를 공유하기 위해서입니다.

+++++++++++++++++++++++
현재 사용중인 교재+++++++++++++++++++++++++++++

주교재 : 윤성우의 \'열혈강의 C프로그래밍\' (FREE LEC)
교양 교재 : 생각하는 프로그래밍(인사이트)

2주차 :: 주교재 윤성우의 열혈강의 C프로그래밍 완독  (진행중)

==========================================시작

먼저 이야기를 시작하기 전에..
저번에 프로젝트를 했을 때의 일이었어.
scanf 함수를 통해서 입력받은 정수값으로 개별 메뉴로 이동하는 프로그램 구성이 있었는데.
첫 입력에서는 잘 작동됐지만, 메뉴의 이동이 많아지면 반복 작동하거나, 혹은 전혀 엉뚱한 메뉴로 이동하는 버그가 있었지.
왜 그럴까 고민하다가 결국엔 키보드를 통해 받은 입력값이 버퍼에 저장되었을 때, 의도한 값 이외에 \'엔터\'나 스페이스.
혹은 생각지도 못한 입력값이 버퍼에 쌓여있었고, 그것이 다음 scanf를 통해 입력받게 되었을 때 버퍼에 쌓여있던 값이 자동으로
입력되면서 일어나는 현상이라는 결론을 얻을 수 있었지.
그래서 해결법을 찾다가, gets를 사용하라는 조언을 들었고 소스에 적용했더니 조금 나아졌지만, 때때로 문제가 생길때가 있었어.
그러다가 fflush()를 잠깐 썼었는데, 횽들에게 따끔하게 쓰지 말라고 충고를 듣고서.
fflush()함수를 빼고 소스를 수정했던 기억이 있다.

자.. 그럼 이제 본론으로.
왜 갑자기 이 이야기를 하냐하면, 오늘 열혈강의 C를 하고 있는데
\'문자와 문자열 처리 함수\'라는 파트에 떡하니 fflush()를 권장하는 내용의 글이 있더라고.
내가 아무것도 몰랐다면은 이걸 그냥, 쓰면되겠거니 했지만.
써서는 안되는 함수라는 조언을 들었고, 또 형들에게 약속도 했으니까.
그냥 읽기는 읽되 fflush는 절대 안쓴다고 생각했다.
그런데 다음에 재미있는 예제가 나오더라고
자 소스 나간다.

int main(void)
{
    char perID[7];
    char name[10];

    fputs("주민등록번호 앞 6자리 입력 :: ", stdout);
    fgets(perID, sizeof(perID), stdin);

    //fflush(stdin); //입력 버퍼 삭제.

    fputs("이름을 입력하세요 :: ",stdout);
    fgets(name, sizeof(name), stdin);

    printf("주민번호 앞자리 : %s\\n", perID);
    printf("이           름 : %s\\n", name);

    return 0;
}

보다시피, 아예 소스까지 제공해놨는데.
문제는 위에서는 scanf함수를 사용하지 않고서 fgets입력을 받았는데도 불구하고,  제공된 배열 이상의 문자열을 입력하면,
다음 fgets 입력때 이전 fgets에서 입력되지 못했던 나머지 문자열들이 자동으로 입력되는 일이 일어나더라고.

난 막연하게 scanf문을 쓰면 이런 일이 일어나 않을 것이라고 생각했는데. 조금 쇼크.

그리고서 필자는 fflush(stdin)의 주석을 지우고 소스에 적용시키면 쌓여있는 입력 버퍼를 날려버릴 수 있기 때문에 fflush()를 사용하라.고
권장하고 있더라.

하지만 이거 솔직히 말이 안되잖아.
저번에 횽들에게 말을 들었다시피, 이거 표준도 아닌 데다가.이거 Unix계열에서는 안먹히는 걸로 알고 있거든.
C언어가 가지는 장점 중 하나가, OS간의 이식성인데. 윈도우즈에서만 빌빌거릴 것도 아니고, 이건 좀 아니다 싶었어.
그리고 조금 더 공부해보니까. fflush() 이거 정체불명로 생각되더라고.

어떤 예제에서는 버퍼에 있는 값을 파일에 출력(저장)할 때 사용한다.
어떤 예제에서는 입력 스트림의 버퍼값을 비우기 위해서 사용한다.
... 등등 기상천외한 방법들.

난 구분이 안가더라고. 이게 입력인지, 출력인지. 아님 소거인지.
상당히 모호한 함수임에는 분명해 보였다.

얼마전에 \'물속의다이아\'횽이 그러더라고.
누가 뭐라고 하면 그걸 무조건 적으로 따라갈 생각하지 말고 스스로 생각해서 판단해야한다고.
ok..
맞는 말씀입니다.
그래서 내가 스스로 판단할 수 있을정도로 조사해보기로 했지.

일단 fflush()함수에 대해서 인터넷으로 꽤 조사를 했고.
또 C언어를 소개하고 있는 책들을 뒤지기 시작했다.

먼저 책의 이야기인데.

**fflush(stdin)에 대해서 소개하고 있는 책들.

열혈강의 C 프로그래밍 (FREE LEC) <-fflush()의 사용법을 설명하고 사용을 권장하고 있음
Teach yourself C (정보문화사) <-열혈강의 보다 더 자세한 fflush(stdin)의 사용법 및 활용
C기초 플러스 (성안당) <-fflush()에 대해서 언급하고 있지만 \'fflush()를 입력스트림에 사용하는 것의 영향은 정의되지 않는 다\'고 언급.


**fflush(stdin)에 대해서 언급하지 않는 책.

The C programming language(대영사) <-내가 못찾는 건지, 아님 C 개발자, 책 저술에 참가해서 그런지 fflush()에 대한 언급 없음.

***인터넷.
네이년 지식인 같은 경우는 fflush() 쓰라는 의견 심심치 않게 볼 수 있음. 다만 가끔씩 댓글로 쓰지 맙시다 하시는 분이 계심.
그 이외의 블로그 같은 경우 fflush()함수에 대해서 자기 의견을 제시한 경우를 많이 찾아 볼수 있음.

결론적으로 이야기하자면, 내가 보기엔 이 fflush(stdin)의 사용에 대한 논란은 하루 이틀일이 아닌것 같아.
또 C를 소개한 책중에서 좀 많이 팔렸다고 이야기할 수 있는 열혈강의 C나 Teach yourself 같은 경우에도 fflush()를 권장하고 있는 걸보면
이걸 써도 되든 안되든 필드에서 fflush()는 꽤 대중적으로 쓰이고 있는 함수인건 확실한거 같아.
하지만 내 생각에는 앞서 말한거지만 fflush()는 Unix계열의 O/S에서는 작동안하는 걸로 알고 있어.
C의 장점중에는 시스템 호환 이식성이라는 녀석이 있지. 솔직히 C의 가장 큰 장점이라고 생각되는데, fflush()를 써버리면,
이식성이 좋다고 말하기엔 무리가 있는 프로그램이 만들어지는게 아닐까.
좋아, 그렇다면 역시 쓰지말자.

하지만 문제가 있었지.
버퍼에 키보드 입력값이 쌓여서 생긴 문제 때문에 fflush()를 사용하는 거기 때문에, scanf를 쓰던, gets를 쓰던.
버퍼에 있는 의도하지 않는 키 입력값을 지우지 않으면 저번 프로젝트에서 일어났던 문제들을 근본적으로 해결할 방법이 없거든.

그래서 또 인터넷과 책을 뒤졌는데.
역시 프겔은 대단해.
 URA! 횽이 친절하게 찾아놨더라고. (https://gall.dcinside.com/list.php?id=programming&no=163481&page=1  )
거기서 찾아낸 함수. 그리고 내부연산.

void buf_bomb(void) <-함수이름 내맘대로 선언.
{
    int c;
    while ((c=getchar()) != EOF && c != \'\\n\');
}

깔끔하다 그냥. 의도하지 않는 값을 다 제껴버리는 연산.

#include <stdio.h>

void buf_bomb(void);

int main(void)
{
    char perID[7];
    char name[10];

    fputs("주민등록번호 앞 6자리 입력 :: ", stdout);
    fgets(perID, sizeof(perID), stdin);

    buf_bomb();

    fputs("이름을 입력하세요 :: ",stdout);
    fgets(name, sizeof(name), stdin);

    printf("주민번호 앞자리 : %s\\n", perID);
    printf("이           름 : %s\\n", name);

    return 0;
}
void buf_bomb(void)
{
    int c;
    while ((c=getchar()) != EOF && c != \'\\n\');
}

그래서 실제로 적용해보니까.
fflush()를 사용해서 버퍼를 날려버린 것 같은 결과가 나온다.
fflush 같은 불확실하고 C의 장점을 갉아먹는 함수를 쓰는것보다 저걸 애용하는 편이 좋겠어.
열혈강의 C나 다른 책보면서 C입문 하는 늅늅들은 참고하세요.

자, 오늘은 여기까지 해볼까한다.
자 그럼 횽들 수고해용.

오늘 일기 끄 ㅌ






추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47653 65
2894191 연휴때 뭐하나 뵜더니 ㅇㅇ(211.235) 10:07 10 0
2894187 그럼 난 진수다 [1] ㅇㅇ(121.168) 09:50 8 0
2894186 한국은 정치 체계 분류는 '약제도화'라고 봐야해 [5] ㅆㅇㅆ(124.216) 09:44 24 0
2894185 사실 민주당이 보수긴 해. 일베 정당은 정당이라기보단 [2] 프갤러(110.8) 09:39 27 0
2894184 하루 벌어서 이틀 먹고 싶다..ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 09:38 20 0
2894183 그리고 민주당은 한국 정치 사학회에서 5년전부터 보수분류임 [2] ㅆㅇㅆ(124.216) 09:35 22 0
2894182 민주당은 보수 정권이지 정확히 진보 정권은 아니긴함. ㅆㅇㅆ(124.216) 09:34 19 0
2894181 저학력 거지 일베가 보수 지지하는 심리 딱 한줄로 표현 [2] 프갤러(110.8) 09:32 20 0
2894180 가난할수록 보수가 많긴함. 부모 학력이 높을수록 진보고 [5] ㅆㅇㅆ(124.216) 09:27 38 0
2894179 판교에서 일하는데 얼마정도 벌면 자취 가능? 프갤러(1.237) 09:27 11 0
2894178 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 09:21 11 0
2894177 전라도 광주도 뚫렸다 납치 인신매매 장기적출 의심사건 [1] ♥덩냥이♥갤로그로 이동합니다. 08:50 21 0
2894176 가을..냇가.ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 08:05 24 0
2894175 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:03 15 0
2894174 하루 한 번 헤르미온느 찬양 [3] 헤르 미온느갤로그로 이동합니다. 08:01 23 0
2894173 5시간만 기다리면 사이카 품번이 받아진다. 뻐기는자가 이긴다. 넥도리아2025(220.74) 07:57 17 0
2894171 민주주의가 먼저다 ㅇㅇ(121.168) 07:36 18 0
2894169 Ai에게 소스코드 지적받는 놈들 [2] 응게이(211.235) 07:26 30 0
2894167 국정농단 비선실세 김현지 의혹 덮으려고 이진숙 불법체포시도 의심은 ㄴㄴ [2] ♥덩냥이♥갤로그로 이동합니다. 07:14 37 0
2894165 사이카 받는데 8시간 ... 넥도리아2025(220.74) 06:42 11 0
2894163 이재용 상속세 탈세했던 한국의 디즈니랜드 근황 [3] 발명도둑잡기(118.216) 06:31 31 0
2894162 야동 사이카 야동 다운 받는데 7시간~10시간 남았데... 넥도리아2025(220.74) 06:24 18 0
2894160 섬나라의 기상 [2] 발명도둑잡기(118.216) 06:05 22 0
2894159 앱히키도 그렇고 유튜버도 그렇고 신기한거 [4] 프갤러(118.235) 05:58 38 0
2894157 중국 러시아가 민주화 되면 좋겠어 ㅇㅇ(39.7) 05:44 17 0
2894155 자위하면서 소리들으면 엄청 혼란 옴. [4] 넥도리아2025(220.74) 04:55 29 0
2894154 일본 여자 친구 사이카가 너무 좋아서 매일 동영상 보고 있어요. 지금ㅏ도 [1] 넥도리아2025(220.74) 04:53 24 0
2894153 일본은 여자 총리 시대네 ㅇㅇ(39.7) 04:39 33 0
2894149 결국 닌텐도 강화유리 필름에 굴복한 남자. 넥도리아2025(220.74) 03:32 16 0
2894147 10일간 엄마없는 집에 살며 참 많은 것을 느꼈다... [5] ㅇㅇ(223.38) 02:22 48 1
2894135 애들아 내 사이트를 좀 더 자주 써주라 [4] ㅆㅇㅆ(124.216) 00:50 67 0
2894131 음기 충전 발명도둑잡기(118.216) 00:38 46 0
2894130 나도 잘하고싶다 [3] 루도그담당(118.235) 00:34 41 0
2894129 나는 내가 실력있다 생각함 [3] ㅆㅇㅆ(124.216) 00:28 62 0
2894127 LG G5 샀다. 액정. H850 no frame으로... [1] 넥도리아2025(220.74) 00:13 19 0
2894126 친구 시발새끼 하나 손절했음 [4] ㅇㅇ(118.235) 00:00 90 1
2894125 SK쉴더스 정보보안 보안관제 초봉 [4] 프갤러(118.235) 10.04 63 2
2894124 c레벨 대신에 족장 어떰 [3] 프갤러(110.8) 10.04 48 0
2894121 perpledity ceo는 나이도 어린데 부자됬으면 타이밍뒷.통수한방(1.213) 10.04 29 0
2894117 후라이드도 괜찬긴 하네 [2] 프갤러(210.217) 10.04 38 1
2894116 C레벨 <- 진짜 충격적인 판교어임 [10] 박민준갤로그로 이동합니다. 10.04 119 0
2894115 아씨발 닭강정 후라이드로 왔네 씨발 프갤러(210.217) 10.04 39 1
2894113 토스도 고이면 문화가 죻아지지않을까? [3] 밀우갤로그로 이동합니다. 10.04 53 0
2894112 아 배달하는 새끼가 자전거네 씨발 프갤러(210.217) 10.04 41 1
2894111 햄버거 말고 닭강정 시킴 [2] 프갤러(210.217) 10.04 47 1
2894109 언리얼 제대로 쓸라면 문서에 있듯이 [5] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 65 1
2894108 컴포지션 원탑으론 러스트 베비 게임 엔진이 있습니다. [5] 프갤러(110.8) 10.04 36 1
2894107 사실 엔진구조 자체는 유니티쪽이 더 신식임 [17] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 84 0
2894106 ㅅㅂ 이직이많다는건 [2] 밀우갤로그로 이동합니다. 10.04 48 0
뉴스 '신인감독 김연경' 한때 IBK 유망주였던 세터 이진, 친정팀 상대로 선전포고! “잘하는 거 보여주고 나올 것” 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2