[질문] scanf 와 gets 을 같이 사용할 수 없나요?

macros의 이미지

   1 #include <stdio.h>
   2 
   3 main()
   4 {
   5     char temp1[1024];
   6     char temp2[1024];
   7 
   8     scanf("%s", temp1);                                                                       
   9     gets(temp2);
  10 
  11     printf("%s \n%s \n", temp1, temp2);
  12 }

위와 같이 scanf 와 gets 을 같이 사용하면 gets 이나 fgets 등의 함수들은
코드를 타지 않더군요..
왜 그런지요..

익명사용자의 이미지

stream 버퍼에 엔터키값이 들어 있어서 그럴겁니다.
scanf 후
fflush(stdin);
코드 추가해 보심이~ ^^

kewlbear의 이미지

이곳 게시판에도 몇번 올라온 내용입니다만 stdin에는 fflush를 쓰면 안됩니다.

macros의 이미지

그런 의심이 들어 몇번 테스트 해봤지만, 역시 안되더군요
뿐만아니라 stdin 에는 fflush 를 사용하지 않는다고하네요..

음...다른방법은 없을까요?

macros의 이미지

Q 12.18 
scanf("%d", ...)를 써서 여러 수치를 읽은 다음, gets()를 써서 문자열을 읽으려 합니다: 
  int n;
  char str[80];
 
  printf("enter a number: ");
  scanf("%d", &n);
  printf("enter a string: ");
  gets(str);
  printf("You typed %d and \"%s\"\n", n, str);
 
그런데 컴파일러는 gets() 호출을 무시합니다! 왜 그런가요? 
 
Answer 
여러분이 위의 프로그램에 데이터를 다음과 같이 입력했다고 가정해 봅시다: 
  42
  a string
 
이 때 scanf는 42를 읽지만, 그 뒤에 나오는 newline을 읽지 않습니다. 이 newline은 input stream에 남아 있고, gets()가 바로 이 newline을 읽게 됩니다. gets()는 newline이 나올 때까지의 입력을 문자열로 리턴해 주므로, 바로 빈 줄을 리턴하게 됩니다. 따라서 입력의 두번째 줄, ``a string''은 아예 읽히지 않습니다. 만약 여러분이 다음과 같이 입력을 주었다면: 
  42 a string
 
프로그램이 예상한 대로 동작할 것입니다. 
일반적으로 scanf() 다음에 바로 gets()과 같은 다른 입력 루틴을 쓰는 것은 바람직하지 않습니다. scanf()의 이런 이상한(peculiar) 방식은 항상 문제를 일으킬 소지가 있기 때문입니다. 따라서 전체 입력을 모두 scanf로 받거나 아예 scanf를 쓰지 않는 것이 좋습니다. 

일단은 의미없는 getchar() 를 scanf 와 fgets 사이에 넣어서 뒀네요..

그래도 영~ 찜찜하다는 ㅡㅡ

익명사용자의 이미지

저 윗 익명 입니다.

fflush(stdin);
작동 안되는군요..

몰랐심다!!!

그럼 만들면 되지 않을까요??

void InputFush(void)
{
  while( getchar() != EOF )
  {
     /*
     // 난 맴돌이다..
     // 아무 의미없다..
     // 그냥 달아본다. 주석
      */
  }
}

라고 생각되는데 잘될지는 ㅡㅡ...
익명사용자의 이미지

다시 위 익명입니다..

http://dpig.tistory.com/archive/20061105

이 링크분이 맹글었구만요!!

요대로 함 해보심이~

------------------------------------------------------------

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.