디시인사이드 갤러리

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

갤러리 본문 영역

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

어떡해갤로그로 이동합니다. 2009.12.22 22:05:35
조회 1489 추천 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 47647 65
2894147 10일간 엄마없는 집에 살며 참 많은 것을 느꼈다... ㅇㅇ(223.38) 02:22 7 0
2894135 애들아 내 사이트를 좀 더 자주 써주라 [1] ㅆㅇㅆ(124.216) 00:50 23 0
2894131 음기 충전 발명도둑잡기(118.216) 00:38 15 0
2894130 나도 잘하고싶다 [2] 루도그담당(118.235) 00:34 24 0
2894129 나는 내가 실력있다 생각함 [2] ㅆㅇㅆ(124.216) 00:28 42 0
2894127 LG G5 샀다. 액정. H850 no frame으로... 넥도리아2025(220.74) 00:13 15 0
2894126 친구 시발새끼 하나 손절했음 [3] ㅇㅇ(118.235) 00:00 64 1
2894125 SK쉴더스 정보보안 보안관제 초봉 [4] 프갤러(118.235) 10.04 39 2
2894124 c레벨 대신에 족장 어떰 [2] 프갤러(110.8) 10.04 32 0
2894121 perpledity ceo는 나이도 어린데 부자됬으면 타이밍뒷.통수한방(1.213) 10.04 22 0
2894117 후라이드도 괜찬긴 하네 프갤러(210.217) 10.04 31 1
2894116 C레벨 <- 진짜 충격적인 판교어임 [10] 박민준갤로그로 이동합니다. 10.04 87 0
2894115 아씨발 닭강정 후라이드로 왔네 씨발 프갤러(210.217) 10.04 34 1
2894114 배달의`민족 3 만 원권 아무나 써 ! [1] ㅇㅇ(223.39) 10.04 17 0
2894113 토스도 고이면 문화가 죻아지지않을까? [2] 밀우갤로그로 이동합니다. 10.04 40 0
2894112 아 배달하는 새끼가 자전거네 씨발 프갤러(210.217) 10.04 32 1
2894111 햄버거 말고 닭강정 시킴 [1] 프갤러(210.217) 10.04 35 1
2894109 언리얼 제대로 쓸라면 문서에 있듯이 [5] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 51 1
2894108 컴포지션 원탑으론 러스트 베비 게임 엔진이 있습니다. [4] 프갤러(110.8) 10.04 26 1
2894107 사실 엔진구조 자체는 유니티쪽이 더 신식임 [16] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 65 0
2894106 ㅅㅂ 이직이많다는건 [2] 밀우갤로그로 이동합니다. 10.04 34 0
2894105 햄버거 떙기는데 햄버거 시킬까? [2] 프갤러(210.217) 10.04 43 1
2894103 C++ 잘아시는분? [8] ㅇㅇ갤로그로 이동합니다. 10.04 57 0
2894102 회사 평균퇴사율보면 토스는 오래가기 힘들어보이던데 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 63 0
2894101 이게 추석이지 [10] ㅇㅇ(121.168) 10.04 73 0
2894100 섹스<<이거 진짜 존재하는 행위냐? [2] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 36 0
2894099 이력서 경력기술서 어케씀 ㅇ.ㅇ [6] 밀우갤로그로 이동합니다. 10.04 41 0
2894098 내 전문성은 비동기 프로그래밍과 클라 ui인데 ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 27 0
2894097 법원이 드디어 화난듯 ㅇㅇ(121.168) 10.04 35 0
2894096 국정농단 비선실세 논란 김현지 게이트 국감 특검 수사로 진실 밝혀야 [3] ♥덩냥이♥갤로그로 이동합니다. 10.04 31 0
2894095 나도 전문화라는걸 해야하는데 클라쪽 전문인데 ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 18 0
2894094 충격적임.. ♥덩냥이♥갤로그로 이동합니다. 10.04 24 0
2894093 대학원 수료한게 석사쪽 의뢰가 간간히 오는게 장점 ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 27 0
2894092 오늘 코퍼스 언어학 관련 말뭉치해석 파싱 파이프라인 만듬 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 31 0
2894090 웨이랜드 좆같은거 맞음 ㅇㅇ [5] 박민준갤로그로 이동합니다. 10.04 33 0
2894089 내란범 뇌물범만 골라서 빠는 2찍 일베들만 하겠냐 [3] 프갤러(110.8) 10.04 36 2
2894088 2찍은 민주당 정권이 하는 모든것에 반대하지 않는다 ㅇㅇ(121.168) 10.04 25 0
2894087 토스도 판교어쓰냐? [2] 밀우갤로그로 이동합니다. 10.04 43 0
2894084 내일 하루 쉬고 또 매일 일해야 하는구나 ㅠㅠ 나르시갤로그로 이동합니다. 10.04 20 0
2894082 weston 업무용 데탑에 대해 레딧에 나르시갤로그로 이동합니다. 10.04 17 0
2894081 속보) 이진숙 방통위원장 불법체포 기각 [4] ♥덩냥이♥갤로그로 이동합니다. 10.04 43 1
2894080 일단 사람 수준은 갖추고 정치 논하자 [2] 프갤러(61.74) 10.04 34 0
2894078 중졸 이하들이 위선이 어쩌고 저쩌고 [4] 프갤러(27.175) 10.04 38 0
2894077 민주당 정권이 위선을 독점하는게 아님 ㅇㅇ(121.168) 10.04 19 0
2894076 코딩을 너무 쉽게 생각해서 문제다. [1] 프갤러(59.16) 10.04 50 0
2894075 술은 무조건 낮술임 [8] ♥덩냥이♥갤로그로 이동합니다. 10.04 44 0
2894074 연휴 모하지 하는 달붕이들은 위한 유흥 가성비 대충 정리 ㅇㅇ(118.235) 10.04 18 0
2894073 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.04 16 0
2894072 인생 선배님들 질문을 여쭙습니다 RPA 직렬 [2] 케인즈갤로그로 이동합니다. 10.04 36 0
뉴스 “많이 아쉽지만 멈추게 됐다”…박성광, 안타까운 소식 전했다 디시트렌드 10.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2