scanf의 특징? 값 입력 받기.

hurryon의 이미지

scanf로 값을 입력 받은 후에 다로 다음에 fgets로 값을 입력 받으려고 하면
fgets에 엔터가 들어가 버리네요. 결국은 제대로 입력을 받지 못한다는...

그래서 제가 시험 삼아 짜보니...정말 그렇네요. 소스는 다음과 같습니다.

#include <stdio.h>

main()
{
        int value;
        char name[10];

        scanf("%d", &value);
        fgets(name, sizeof(name), stdin);

        printf("-출력-\n");
        printf("%d", value);
        printf("%s", name);
}

결과는

[root@note work]# gcc -o 3 3.c
[root@note work]# ./3
1
-출력-
1

아무래도 엔터가 바로 fgets에 들어가 그런것 같은데...이럴때는 어떻게
해결을 하셨는지 궁금합니다. 아니면 scanf을 이용하여 문자(char 가 아닌
정수 타입)을 받으려면 다른 방법이 있는 걸까요?

프로그래밍을 혼자 하다보니 어떤게 좋은 습관인지 감이 안오네요.

버그소년의 이미지

어디선가 주어들은 얘긴데요..

scanf와 fgets를 혼용해서 사용하지 않는것이 좋다는군요..

scanf를 한 이후에 fgets등을 사용하게되면 당근 \n(개행문자)를 소비해주어야합니다.

scanf가 꼭 필요한 상황이 아니라면 fgets/gets를 사용하는것을 추천합니다.

가끔은 밥을 굶어도 살 수 있다.

김충길의 이미지

scanf ("%d\n");

위처럼 써보세요.

screen + vim + ctags 좋아요~

park의 이미지

scanf ("%d\n");

저것으로 버퍼에 남아있는 \n가 어떻게 사라지는지..

설명좀 부탁드립니다..

내공이 허접한지라 궁금하네요..

:-)

청춘

iwidwh의 이미지

scanf 함수가 저는 쓰기가 좀 뭐한게
위에서 말한 문제 때문에 좀 그렇더라고요

부득이 하게 쓰게 되면

fflush(stdin);

이라는 코드를 달고 다닙니다.

제가 알기에 입출력에 관해서는
stdin, stdout, stderr이렇게 세가지의 스트림을 통해서
처리되는 걸로 알고 있습니다.

scanf같은 경우는 마지막에 \n을 기준으로 입력을 처리하는 걸로 아는데
만약에 stdin이라는 스트림에 \n이 남아 있으면 다음에 입력받을때

먼저 \n을 입력 받아서 입력이 잘못 되는 경우가 많습니다.

그래서 stdin에 있는 내용들을 비우고 사용 하는 코드가
fflush(stdin) 입니다.

flush가 화장실에서 물내리는거 맞죠?

scanf가는 곳에 fflush가면 문제 없을꺼 같은데요..

cdpark의 이미지

fflush(stdin)은 절대로 사용하지 마세요. (toy program이 아니라면요.)

input stream에 대한 fflush 함수 결과는 정의되어 있지 않습니다.

(입력이 키보드가 아닌 redirection인 경우는 어떻게 하시려고요?)

eungkyu의 이미지

park wrote:
scanf ("%d\n");

저것으로 버퍼에 남아있는 \n가 어떻게 사라지는지..

scanf는 formatted input을 받는 함수입니다. format 자리에는 %d, %s 등과 같은 것과 동시에 받을 문자열의 format을 지정할 수 있습니다. 예를 들어 흔히 사용하는 빈칸은 하나 이상의 whitespace를 의미합니다. "%d\n"는 말 그대로 %d 즉 정수 뒤에 \n 즉 줄바꿈이 오는 경우 그 정수를 뒤에 적게 될 변수에 넣어달라는 의미가 됩니다.

그리고 input stream은 물론 그 format에 match된 만큼 읽어서 가져가니까 뒤에 \n이 없어지겠죠. 단, 입력 뒤에 줄바꿈이 없을 수도 있는 경우에는 위의 방법을 사용하면 안됩니다. format이 일치하지 않으므로 입력이 되지 않습니다.

저같으면 이렇게 사용하겠습니다.

scanf("%d ", &n);

이런 식으로 하면 정수 뒤의 모든 whitespace를 scanf가 읽어버려서 다음의 입력에 문제가 없게 됩니다.

musiphil의 이미지

iwidwh wrote:
그래서 stdin에 있는 내용들을 비우고 사용 하는 코드가
fflush(stdin) 입니다.

flush가 화장실에서 물내리는거 맞죠?

scanf가는 곳에 fflush가면 문제 없을꺼 같은데요..


화장실에서 물내리는 건 아직 나가지 않은 출력물을 비우는 거죠. ;-)
lapex의 이미지

scanf("%d", &value); getchar(); getchar() 로 그냥 엔터값을 받아 버리세여..

댓글 달기

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