scanf랑 fgets는 같이 쓰면 안되나요?
글쓴이: 익명 사용자 / 작성시간: 목, 2002/01/10 - 3:18오후
안녕하세요.
밑에 공백입력에 대해 많은 도움을 주셔서 감사드립니다.
답변 주신대로 fgets를 이용해서 입력을 받았어요...
그런데 fgets로 입력받기 전에 scanf로 입력을 받는데 있거든요...
여기서 문제가 생기네요..
소스는. ..
#include
#include
#include
int main()
{
char save_dir[100], title[256];
printf("%s", " 입력하세요.1 \n ");
scanf("%s", save_dir ) ;
fflush(stdin);
printf("%s", " 입력하세요.2 \n ");
fgets(title,256,stdin);
printf("%s\n", title);
fflush(stdin);
}
두번째 fgets로 입력받기 위해 커서가 대기해야되는데 대기하지않고 바로
끝나버려요....
이둘은 같이 쓰면 안되나요?
Forums:
Re: scanf랑 fgets는 같이 쓰면 안되나요?
일단 scanf에 문제가 있다는 것 같습니다. ^^;
scanf는 버퍼에 있는 내용을 읽는데 재수가 없어서 버퍼에 내용이 남아있
다면 키보드입력을 기다릴 이유가 없는 거죠. 그런데 그 재수 없는 상황이
란 것이 아주 잘 일어나더군요.
그나마 비주얼 스튜디오는 scanf를 사용하기 전에 stdio의 버퍼를 fflush
를 사용해서 비워주면 입력을 잘 기다립니다. 그러나 리눅스에서는 아니더
군요.
저는 그래서 입력받을일이 있다면 확장자를 얼른 .cpp로 바꾸고 cin을 사
용합니다. 편법이죠...
즐거운 하루 되시기 바랍니다. ^^;
Re: scanf랑 fgets는 같이 쓰면 안되나요?
http//kldp.org/script/bbs/read.php?table=qa2&no=394
일단 윗글 참고 하시고요
stdin 비우는건... fflush 가 아닙니다. 그건 output 버퍼 비워 주는것입
니다..
글구 scanf 한다음
fgets 했을 때 바로 return 되는것은 입력 버퍼에 데이타가 남아 있기 때
문입니다.
#include
#include
#include
#include
int main()
{
char save_dir[100], title[256];
printf("%s", " 입력하세요.1 \n ");
scanf("%s\n", save_dir ) ;
printf("%s",save_dir);
__fpurge (stdin);
printf("%s", " 입력하세요.2 \n ");
fgets(title,256,stdin);
printf("%s\n", title);
}
이렇게 해보세요...~~~
글구 scanf 로 받는거 보다...
fgets 로 받는게 더 좋다고 보여지네요...
Re: scanf랑 fgets는 같이 쓰면 안되나요?
밑에 제가 scanf에 대해 쓴글이 있긴 하지만,
사실 리눅스에선 써본적이 거의 없습니다.gets는 두말할것도-_-없죠.
(버퍼의 크기 지정불능...;;)
FAQ같은곳에는 왠만하면 쓰지말라고 나왔었는데,
자꾸 강조하시길래,얼떨결에 썼나봅니다.
어쩃든 문제가 있는 함수인건 확실합니다.(그럼 왜 가르쳐준건
지..;;)
왜 안써야 하나면,
scanf에서의 공백문자를 입력하는데에 문제가 있고,
(스캔셋을 이용하면되지만,사실 이것도 문제는 있습니다...)
문자에서 수치로의 변환이 않되 무한루프의 발생이 날수 있고,
리턴키만 누른다던지등의 입력같은건 모두 처리를 할수없습니다.
에러의 발생원인도 불가능하다고 본적이 있네요.
결과적으로 임동현님 말씀처럼 다른 함수(fgets함수등)를 쓰시는것이 좋습
니다.
다른 fscanf나 sscanf에는 이러한문제와는 관계없으니 쓰셔도 좋습니다.
Re^2: scanf랑 fgets는 같이 쓰면 안되나요?
^^;
fflush는 output buffer만을 비우는 함수가 아닌 것으로 알고 있습니다.
아닌가요?
즐거운 하루 되시기 바랍니다. ^^;
Re^3: scanf랑 fgets는 같이 쓰면 안되나요?
output buffer 만 비웁니다.
직접 해 보시지요.^^
fflush - flush a stream
SYNOPSIS
#include
int fflush(FILE *stream);
DESCRIPTION
If stream points to an output stream or an update stream in
which the most recent operation was not input, fflush()
causes any unwritten data for that stream to be written to
the file, and the st_ctime and st_mtime fields of the
underlying file are marked for update.
If stream is a null pointer, fflush() performs this
flushing action on all streams for which the behavior is
defined above
댓글 달기