scanf랑 fgets는 같이 쓰면 안되나요?

익명 사용자의 이미지

안녕하세요.
밑에 공백입력에 대해 많은 도움을 주셔서 감사드립니다.
답변 주신대로 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로 입력받기 위해 커서가 대기해야되는데 대기하지않고 바로
끝나버려요....
이둘은 같이 쓰면 안되나요?

익명 사용자의 이미지

일단 scanf에 문제가 있다는 것 같습니다. ^^;
scanf는 버퍼에 있는 내용을 읽는데 재수가 없어서 버퍼에 내용이 남아있
다면 키보드입력을 기다릴 이유가 없는 거죠. 그런데 그 재수 없는 상황이
란 것이 아주 잘 일어나더군요.
그나마 비주얼 스튜디오는 scanf를 사용하기 전에 stdio의 버퍼를 fflush
를 사용해서 비워주면 입력을 잘 기다립니다. 그러나 리눅스에서는 아니더
군요.

저는 그래서 입력받을일이 있다면 확장자를 얼른 .cpp로 바꾸고 cin을 사
용합니다. 편법이죠...

즐거운 하루 되시기 바랍니다. ^^;

익명 사용자의 이미지

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 로 받는게 더 좋다고 보여지네요...

익명 사용자의 이미지

밑에 제가 scanf에 대해 쓴글이 있긴 하지만,

사실 리눅스에선 써본적이 거의 없습니다.gets는 두말할것도-_-없죠.

(버퍼의 크기 지정불능...;;)

FAQ같은곳에는 왠만하면 쓰지말라고 나왔었는데,

자꾸 강조하시길래,얼떨결에 썼나봅니다.

어쩃든 문제가 있는 함수인건 확실합니다.(그럼 왜 가르쳐준건
지..;;)

왜 안써야 하나면,

scanf에서의 공백문자를 입력하는데에 문제가 있고,

(스캔셋을 이용하면되지만,사실 이것도 문제는 있습니다...)

문자에서 수치로의 변환이 않되 무한루프의 발생이 날수 있고,

리턴키만 누른다던지등의 입력같은건 모두 처리를 할수없습니다.

에러의 발생원인도 불가능하다고 본적이 있네요.

결과적으로 임동현님 말씀처럼 다른 함수(fgets함수등)를 쓰시는것이 좋습
니다.

다른 fscanf나 sscanf에는 이러한문제와는 관계없으니 쓰셔도 좋습니다.

익명 사용자의 이미지

^^;

fflush는 output buffer만을 비우는 함수가 아닌 것으로 알고 있습니다.

아닌가요?

즐거운 하루 되시기 바랍니다. ^^;

익명 사용자의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.