C언어, 사용자로 부터 입력받기....

gurumong의 이미지

Quote:
scanf 함수 자체가 사용자의 interactive input 을 바로 받아 처리하기
위한 용도로 설계된 함수는 아닙니다.

scanf함수를 어떻게 사용하는것이 올바르게 사용하는 방법인가요?
이전에 C언어에서 사용자입력은 모두 문자열로 받아서 파싱하라는 말을 들은거 같은데
어떻게 사용하는것인지 감이 오질 않네요 ㅜ.ㅜ
nouveou의 이미지

전 키보드 입력 받을때 fgets를 씁니다.

man page에 있는 내용입니다
이름
fgetc, fgets, getc, getchar, gets, ungetc - 문자와 문자열을 입력 받는
함수

사용법

       #include <stdio.h>
 
       int fgetc(FILE *stream);
       char *fgets(char *s, int size, FILE *stream);
       int getc(FILE *stream);
       int getchar(void);
       char *gets(char *s);
       int ungetc(int c, FILE *stream);

fgets() 는최대 size - 1 개 이하의 문자를 stream으로부터읽어서 s가가리키
는 버퍼에 저장한다. 그러나 EOF나개행 문자를 입력 받았을 경우에는 읽기를
멈춘다. 입력 받은 개행 문자는 그대로 버퍼에 저장하고 ’\0’을버퍼의 마지
막 문자 다음에 추가한다.

fgets(buf, MAX_LINE, stdin)
이런식으로요

cinsk의 이미지

매우 주관적인 의견입니다만:

가. 사람에게서 직접 입력받는 프로그램을 만드는 경우:

1. scanf()를 안쓰는 것이 올바른 사용 방법입니다.

2. 입력받는 내용의 줄 길이가 확실하게 제한되어 있다면, fgets()를 쓰면 됩니다.

3. 입력받는 내용의 줄 길이에 제한이 없다면, GNU 확장 기능인 getline()을 쓰면 됩니다. getline()을 쓰기 싫다면, malloc/getchar 등을 써서 직접 만들 수 있습니다.

4. 좀 더 편리한 interface를 만들고 싶다면, GNU readline/history library를 쓰면 더욱 좋습니다.

5. gets()는 절대로 쓰면 안됩니다.

나. 완벽하게 고정된(human-readable이 아닌) 입력을 받아 처리하는 경우:

a. 이 경우 대개의 경우 stdin을 쓰지 않고 파일 이름을 전달하는 방식으로 프로그램을 작성하게 됩니다. stdin을 쓰는 경우라면 scanf()를 써도 되지만, 보통 fscanf()를 써서 처리합니다.

b. 위 2,3의 내용 그대로 적용됩니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

IsExist의 이미지

FILE 기반의 함수들은 기본적으로 LF(엔터키. dos에서는 CR LF)을 입력 끝으로 인식합니다.
사용자가 LF을 입력하기 전에는 FILE 함수가 컨트롤을 가지고 있죠.

FILE 기반의 함수는 일관된 입력이 가정된 경우에 편리합니다.
키보드나 파일을 일관되게 입력으로 가정하니깐요.

반면에 interactive input은 키보드 입력만을 가정하는 것이라 컨트롤 문자의
입력이나 escape 문자의 입력을 고려해야 합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

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