7. Input and Output

7.1. Standard Input and Output

๋ฌธ์ž ์ŠคํŠธ๋ฆผ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ๊ฐ ํ–‰์˜ ๋์—๋Š” ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋Š” ์ค„๋ฐ”๊ฟˆ ๋˜๋Š” ๋ฆฌํ„ดํ‚ค ๋“ฑ์— ์ ์ ˆํžˆ ๋Œ€์‘ํ•˜๋Š” ๋™์ž‘์„ ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ๋ฐฉ๋ฒ•์€ ๋ณดํ†ต์˜ ํ‚ค๋ณด๋“œ๋กœ ํ‘œ์ค€ ์ž…๋ ฅ์˜ getchar๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ํ•œ ๋ฌธ์ž์”ฉ ์ฝ์–ด ๋“ค์ด๋Š” ๊ฒƒ์ด๋‹ค. getchar๋Š” ๊ทธ๊ฒƒ์ด ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ์˜ ์ž…๋ ฅ ๋ฌธ์ž๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ํŒŒ์ผ์˜ ๋์„ ๋งŒ๋‚˜๋ฉด EOF๋ผ๋Š” ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค. ์ด ๊ฐ’์€ ์ƒ์ˆ˜๊ณ  ๋ณดํ†ต -1์˜ ๊ฐ’์„ ๊ฐ€์ง€์ง€๋งŒ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ๋Š” <๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ณด๋“œ ๋Œ€์‹ ์— ํŒŒ์ผ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด prog๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ getchar๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋ฉด infile์ด๋ผ๋Š” ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž๋ฅผ ์ฝ์–ด ๋“ค์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค.

ํŒŒ์ผ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ธฐ

prog <infile

<infile์€ argv ์•ˆ์— ์žˆ๋Š” ๋ช…๋ น ๋ผ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ž…๋ ฅ ์ „ํ™˜์€ ๋งŒ์•ฝ ์ž…๋ ฅ์ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋ถ€ํ„ฐ ์˜จ๋‹ค ํ•ด๋„ ๋ฐ–์—์„œ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ธฐ

otherprog|prog

์œ„์™€ ๊ฐ™์€ CLI ๋ช…๋ น์–ด๋Š” otherprog์™€ prog๋ผ๋Š” ๋‘ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  otherprog์˜ standard output์„ prog์˜ standard input์œผ๋กœ ๋˜๊ฒŒ ํ•œ๋‹ค.

์ถœ๋ ฅ์„ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ

putchar๋Š” ๋ฌธ์ž๋ฅผ ํ‘œ์ค€ ์ถœ๋ ฅ์ธ ์Šคํฌ๋ฆฐ์— ๋ณด๋‚ธ๋‹ค. ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์—๋Š” EOF๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ๋กœ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

prog >outfile

์ž…์ถœ๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ํ–‰์ด ํ•„์š”ํ•˜๋‹ค.

#include <stdio.h>

์ด๋•Œ ์ด๋ฆ„์€ <>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌถ๋Š”๋ฐ ์ด๊ฒƒ์€ ํ‘œ์ค€ ์ง€์ •์žฅ์†Œ์— stdio.h ํŒŒ์ผ์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋ง‰๊ฐ„ ๊ด„ํ˜ธ ํ‘œํ˜„ ์ •๋ฆฌ

  • () parentheses

  • {} curly bracket or brace

  • [] square bracket or just bracket(US)

  • <> pointy bracket or less than greater than

7.2. Formatted Output-Printf

์ถœ๋ ฅํ•จ์ˆ˜ printf๋Š” ๋‚ด๋ถ€์˜ ์ˆ˜์น˜ ๊ฐ’์„ ๋ฌธ์ž๋กœ ๋ฐ”๊พธ์–ด ์ค€๋‹ค.

int printf(char *format, arg1, arg2, ...)

printf๋Š” format์ด๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ํ˜•์‹ํ™”ํ•œ ๋‹ค์Œ ์ถœ๋ ฅ์‹œํ‚ค๊ณ  ์ถœ๋ ฅ๋œ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ถœ๋ ฅํ˜•์‹ ์ œ์–ด ๋ฌธ์ž์—ด์€ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ์ถœ๋ ฅ๋  ๋ณดํ†ต์˜ ๋ฌธ์ž์ด๊ณ (๊ทธ๋ƒฅ ๋ฌธ์ž) ๋˜ ํ•˜๋‚˜๋Š” ์ถœ๋ ฅํ˜•์‹์„ ์ •ํ•ด์ฃผ๋Š” ์ปจ๋ฒ„์ „ ๋ฌธ์ž(์ฑ…์—์„œ๋Š” conversion specification)์ด๋‹ค. ์ฆ‰ ๋ณ€์ˆ˜์˜ ์ž๋ฆฌ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” syntax์ด๋‹ค.

์ปจ๋ฒ„์ „ ๋ฌธ์ž์˜ ์•ž์—๋Š” %๋ฅผ ๋ถ™์ธ๋‹ค. %์™€ ์ปจ๋ฒ„์ „ ๋ฌธ์ž ์‚ฌ์ด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณ€ํ™˜๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์™ผ์ชฝ์— ๋งž์ถ”์–ด ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๋Š” - ๋ถ€ํ˜ธ

  • ์ตœ์†Œ ๋„ˆ๋น„๋ฅผ ์ง€์ •ํ•˜๋Š” ์ˆซ์ž. ๋ณ€ํ™˜๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ ์–ด๋„ ์ด ๋„ˆ๋น„๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ๊ธธ์ด๋ณด๋‹ค ์งง๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์˜ ํญ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๊ณต๋ฐฑ ๋˜๋Š” 0์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

  • ์œ ํšจ์ˆซ์ž๋ฅผ ํƒ€๋‚˜๋‚ด๋Š” ๋งˆ์นจํ‘œ .

  • ์ •๋ฐ€๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž.

    • ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ : ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์˜๋ฏธ

    • ์‹ค์ˆ˜ํ˜•์˜ ๊ฒฝ์šฐ : ์†Œ์ˆ˜์  ์ดํ•˜ ์ˆซ์ž ๊ธธ์ด๋ฅผ ์˜๋ฏธ

    • ์ •์ˆ˜ํ˜•์˜ ๊ฒฝ์šฐ : ์ตœ์†Œ ์ˆซ์ž ๊ธธ์ด๋ฅผ ์˜๋ฏธ

  • ๋งŒ์ผ ์ •์ˆ˜๊ฐ€ short๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋ฉด h, long์œผ๋กœ ์ถœ๋ ฅ์‹œํ‚ค๋ ค๋ฉด l์„ ์“ด๋‹ค.

    printf์˜ ์ปจ๋ฒ„์ „ ๋ฌธ์ž๋“ค

    ์ปจ๋ฒ„์ „ ๋ฌธ์ž

    ์ถœ๋ ฅ ํ˜•ํƒœ

    d, i

    int 10์ง„์ˆ˜

    o

    int 8์ง„์ˆ˜

    x, X

    int 16์ง„์ˆ˜

    u

    int ๋ถ€ํ˜ธ ์—†๋Š” 10์ง„์ˆ˜

    c

    int ๋‹จ์ผ ๋ฌธ์ž

    s

    char* ๋ฌธ์ž์—ด๋กœ๋ถ€ํ„ฐ '\0'์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋ฌธ์ž๊ฐ€ ์ถœ๋ ฅ๋˜๊ฑฐ๋‚˜ ์ •๋ฐ€๋„์— ์˜ํ•ด ์ฃผ์–ด์ง„ ๋ฌธ์ž์ˆ˜๋งŒํผ๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.

    f

    double [-]m, dddddd ์—ฌ๊ธฐ์„œ d๋Š” ์ •๋ฐ€๋„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.(๊ธฐ๋ณธ์€ 6์ž๋ฆฌ)

    e, E

    double [-]m, ddddd eยฑxx ๋˜๋Š” [-]m, ddddddEยฑxx, ์—ฌ๊ธฐ์„œ๋„ d๋Š” ์ •๋ฐ€๋„์— ๋”ฐ๋ผ.(๊ธฐ๋ณธ 6์ž๋ฆฌ)

    g,G

    double ๋งŒ์ผ ์ง€์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„ ์ •๋ฐ€๋„ ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ -4๋ณด๋‹ค ์ž‘์œผ๋ฉด %e or %E๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด %f๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋’ค์— ๋ถ™๋Š” 0๊ณผ ์†Œ์ˆ˜์ ์€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

    p

    void* ํฌ์ธํ„ฐ, ์–ด๋–คํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ๋“  ์ง‘์–ด๋„ฃ์œผ๋ฉด ์ฃผ์†Œ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๋ฐ ์ด๋Š” ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„.

    %

    ๋ณ€ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ %์ถœ๋ ฅ.

    ์ •๋ฐ€๋„๋Š” *๋กœ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์ถœ๋ ฅํ˜•ํƒœ๋Š” ์ถœ๋ ฅ๋  ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ๋Œ€ ๊ธธ์ด๋งŒํผ์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์ด๋ฅผํ…Œ๋ฉด ๋‹ค์Œ์„ ๋ณด์ž.

%-15.10s
// ์ด๋Š” 15๊ฐœ์˜ ์ž๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋ฌธ์ž์—ด์„ 10์ž๋ฆฌ ๊นŒ์ง€ ํ‘œํ˜„ํ•˜๋ฉฐ ์™ผ์ชฝ์ •๋ ฌ(-)ํ•˜๋ผ๋Š” ์˜๋ฏธ๋‹ค
// ๋‹ค์Œ์„ ๋ฆฌํ„ดํ•œ๋‹ค. |๋Š” ๊ฒฝ๊ณ„๋ฅผ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค.
|hello, wor      |

์ฃผ์˜ํ•  ๊ฒƒ์€ ์ปจ๋ฒ„์ „ ๋ฌธ์ž๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์ด ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

7.3. Variable-length Argument Lists

๊ฐ€๋ณ€ ๊ธธ์ด(variable-length)๋ฅผ ๊ฐ€์ง„ parameter ๋ฅผ portableํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ minprintf๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

#include <starg.h>

void minprintf(char *fmt, ...){
  va_list ap; 
  // ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐจ๋ก€๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜, argument pointer์˜ ์•ฝ์ž๋กœ ์ง€์—ˆ๋‹ค.
  char *p, *sval;
  int ival;
  double dval;
  va_start(ap, fmt);
  // va_start๋Š” va_list์— ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š” ์—ญํ• ์ด๋‹ค
  for(p = fmt; *p; p++){
    // ์ด๊ฒƒ์€ ํฌ๋งท๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ ๊ธ€์ž์‹ ๋ณด๋Š” ๋ฃจํ”„์ด๋‹ค.
    // pointer์™€ array๋ฅผ ๊ธฐ์–ตํ•˜์ž
    if(*p != '%'){
      putchar(*p);
      continue;
      // ์ปจ๋ฒ„์ „ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์ปจํ‹ฐ๋‰ดํ•œ๋‹ค.
    }
    switch(*++p){
      // %์ผ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ธ€์ž์— ๋”ฐ๋ผ switch
      case 'd':
        // ์ •์ˆ˜ํ˜•์ด๋ฏ€๋กœ
        ival = va_arg(ap,int);
        // var_arg๋Š” ํ•จ์ˆ˜๋กœ ๋“ค์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ 
        // ap๊ฐ€ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฆฌํ„ดํ•œ๋‹ค.
        // stdarg.h๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ด๋ ˆ์ด ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ 
        // ๊ทธ๋Ÿผ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ ๋ถ™์–ด ์žˆ์„ ๊ฒƒ์ด๋ฉฐ ๋•Œ๋ฌธ์—
        // ๋ฐฐ์—ด์—์„œ ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค์Œ ์›์†Œ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ
        // ๊ธฐ์กด ap์— ap๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์˜ ๊ณต๊ฐ„ ๋‹ค์Œ์—
        // ๋‹ค์Œ ์ˆœ์„œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
        // ๋•Œ๋ฌธ์— ๋’ค์— ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด๋‹ค.
        printf("%d",ival);
        break;
      case 'f':
        dval = va_arg(ap,dobule);
        printf("%f",dval);
        break;
      case 's':
        for(sval=va_arg(ap, char*); *sval; sval++){
          putchar(*sval);
        }
        break;
      default:
        putchar(*p);
        break;
    }
  }
  va_end(ap);
  // ap์— ์žˆ๋Š” ๊ฒƒ์„ ์ง€์šด๋‹ค.
}

๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ %s, %f, %d๋ฅผ ๋„ˆ๋น„๋‚˜ ์œ ํšจ์ž๋ฆฌ์ˆ˜ ๋”ฐ์œ„๋ฅผ ์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฐ›์€ ๋ณ€์ˆ˜ ๊ทธ๋Œ€๋กœ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ฏธ๋‹ˆ ํ•จ์ˆ˜์ด๋‹ค.

7.4. Formatted Input-Scanf

ํ•จ์ˆ˜ scanf๋Š” printf์™€ ์‚ฌ์šฉ๋ฒ•์ด ์œ ์‚ฌํ•œ ํ•จ์ˆ˜์ธ๋ฐ, ์ถœ๋ ฅํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ์ž…๋ ฅํ•จ์ˆ˜์ด๋‹ค. scanf๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์„œ format์˜ ๋ณ€ํ™˜ํ˜•์‹์— ๋”ฐ๋ผ ๊ทธ๋“ค์„ ํ•ด์„ํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ฆ‰, ํฌ๋งท๋ฌธ์ž์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ๊ณ ๋‚˜์„œ ์ž…๋ ฅ์„ ํ•˜๋ฉด, ํ•ด๋‹น ํฌ๋งท์— ๋งž๊ฒŒ ํ•ด์„ํ•œ๋‹ค. ํฌ๋งท ๋ฌธ์ž์—ด์„ ์ฃผ์ง€ ์•Š์„ ๋• ๋ณดํ†ต์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ž…๋ ฅ๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์œ„์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋‹ค. ์ฆ‰, ๋ฌธ์ž๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ณ€์ˆ˜์˜ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํฌ๋งท๋ฌธ์ž์—ด(์ปจ๋ฒ„์ „๋ฌธ์ž์—ด)์€ ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค.

  • ๊ณต๋ฐฑ ๋˜๋Š” ํƒญ ์ฆ‰ ํ™”์ดํŠธ์ŠคํŽ˜์ด์Šค๋Š” ๋ฌด์‹œ๋œ๋‹ค.

  • %๋ฅผ ์ œ์™ธํ•œ ๋ณดํ†ต ๋ฌธ์ž๋“ค

  • %์ปจ๋ฒ„์ „ ๋ฌธ์ž, ๋ณ€ํ™˜์ด ์—†์Œ์„ ์•Œ๋ฆฌ๋Š” *, ์ตœ๋Œ€ ์ž๋ฆฌ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ˆซ์ž, short/long์„ ์ •ํ•ด์ฃผ๋Š” h, l, L

cf. 16์ง„์ˆ˜๋Š” ์˜์–ด๋กœ hexadecimal์ด๋ฉฐ x๋Š” ์ด๋ฅผ ์œ„ํ•œ ์•ฝ์ž์ด๋‹ค.

๊ธฐ๋ณธ scanf ๋ณ€ํ™˜

์ปจ๋ฒ„์ „๋ฌธ์ž

์ž…๋ ฅ๋ฐ์ดํ„ฐ : ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…

d

10์ง„์ˆ˜ ์ •์ˆ˜ : INT *

i

์ •์ˆ˜ : INT *, ์ •์ˆ˜๋Š” 8์ง„์ˆ˜(์ˆซ์ž์•ž์— O๋ฅผ ๋ถ™์ด๋ฉด) ๋˜๋Š” 16์ง„์ˆ˜(์ˆซ์ž์•ž์— Ox ๋˜๋Š” OX๋ฅผ ๋ถ™์ด๋ฉด)๊ฐ€ ๋ ์ˆ˜๋„ ์žˆ๋‹ค.

o

8์ง„์ˆ˜ ์ •์ˆ˜(์•ž์— O๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š”) : int *

u

๋ถ€ํ˜ธ ์—†๋Š” 10์ง„์ˆ˜ ์ •์ˆ˜ : unsigned int *

x

16์ง„์ˆ˜ ์ •์ˆ˜(์•ž์— Ox๋‚˜ OX๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š”) : int *

c

๋ฌธ์ž : char *, white space์˜ ๋›ฐ์–ด๋„˜๊ธฐ๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ์˜ non-white space ๋ฌธ์ž๋ฅผ ์ฝ์–ด ๋“ค์ด๋ ค๋ฉด %1s๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

s

๋ฌธ์ž์—ด : char *, ๋ฌธ์ž์—ด์„ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ํฌ๊ธฐ์˜ ๋ฌธ์ž ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ฌธ์ž์—ด ๋์—๋Š” '\0'์„ ๋ถ™์ธ๋‹ค.

e, f, g

๋ถ€ํ˜ธ, 10์ง„ํฌ์ธํ„ฐ์™€ ์ง“์ˆ˜๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋™์†Œ์ˆ˜์ ์ˆ˜ : float *

%

๋ฌธ์ž % : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์˜ ํ• ๋‹น์€ ์ด์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

๋ณดํ†ต ๊ฒฐ๊ณผ๋Š” ๋Œ€์‘๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์ง€๋งŒ, ์ปจ๋ฒ„์ „๋ฌธ์ž *์— ์˜ํ•ด ์ž…๋ ฅ๋˜๋Š” ํ•ญ๋ชฉ์€ ํ• ๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค. ์ž…๋ ฅ ํ•„๋“œ๋Š” non-white space๋ฌธ์ž์˜ ๋ฌธ์ž์—ด๋กœ ์ •์˜๋˜๊ณ  ๋‹ค์Œ์˜ white space๋ฌธ์ž๊นŒ์ง€ ๋˜๋Š” ํ•„๋“œ ๋„ˆ๋น„๊ฐ€ ๋ช…์‹œ๋˜์—ˆ์„ ๊ฒฝ์šฐ ํ•„๋“œ ํญ๊นŒ์ง€์˜ ํ•„๋“œ๊ฐ€ ๋œ๋‹ค.

๋ณต์žกํ•˜๊ฒŒ ์จ์žˆ์ง€๋งŒ ๋‹ค์Œ์˜ ์˜ˆ์‹œ๋ฅผ ๊ทธ๋ƒฅ ๋ณด์ž.

#include <stdio.h>

main(){
  double sum, v;
  sum = 0;
  while(scanf("%1f",&v) == 1)
    // ๋‹ค์Œ์˜ non-white space ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ›๊ณ ("%1s")
    // ๊ทธ๊ฒƒ์„ call by value๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ธํ„ฐ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋œ(&v)
    // v์— ์ €์žฅํ•œ๋‹ค. scanf์˜ ๋ฆฌํ„ด ๊ฐ’์€ ์ฝ์€ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ ์ด๋ฏ€๋กœ
    // EOF๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ฝ์€ ๋ฌธ์ž๋Š” 1๊ธ€์ž์”ฉ ์ฆ‰ ์œ„์˜ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ์กฑํ•˜๊ฒŒ๋˜๊ณ 
    // EOF๋ฅผ ๋งŒ๋‚˜๋ฉด EOF๊ทธ๋Œ€๋กœ๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— while ๋ฌธ์ด ๋๋‚œ๋‹ค.
    printf("\t%.2f\n", sum+=v);
    // ์ฝ์–ด๋“ค์ธ ์ˆซ์ž๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ์นœ ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค.
  retun 0;
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์›ํ•œ๋‹ค๋ฉด

25 Dec 1988

scanf ๋ช…๋ น๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ด๋‹ค.

int day, year;
char monthname[20];
scanf("%d %s %d", &day, monthname, &year);

์—ฌ๊ธฐ์„œ๋Š” ํฌ๋งท๋ฌธ์ž์—ด๋กœ ์„ธ๊ฐ€์ง€ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์ง€์ •ํ–ˆ๊ณ , ํ™”์ดํŠธ์ŠคํŽ˜์ด์Šค๋กœ ๊ตฌ๋ถ„ํ–ˆ์œผ๋ฉฐ ํ•ด๋‹น ์ž…๋ ฅ๋ฐ์ดํ„ฐ๋ฅผ day, monthname, year๋กœ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ธํ„ฐ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ–ˆ๋‹ค(monthname์€ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ํฌ์ธํ„ฐ๊ธฐ ๋•Œ๋ฌธ์— &๊ฐ€ ์—†๋‹ค).

mm/dd/yyํ˜•ํƒœ๋กœ ์ฝ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

int day, month, year
scanf("%d/%d/%d", &month,&day,&year);

์œ„์˜ ๋‘๊ฐ€์ง€ ์ž…๋ ฅ์ค‘ ์–ด๋–ค ํ˜•ํƒœ๋„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ์ž…๋ ฅ๋œ ๋ผ์ธ์„ ํ•ด๋‹น ํฌ๋งท๋ฌธ์ž์—ด์— ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ์กฐ๊ฑด๋ฌธ ์‚ผ์œผ๋ฉด ๋œ๋‹ค.

while(getline(line,sizeof(line))>0){
  if(sscanf(line,"%d %s %d", &day, monthname, &year) == 3){
    printf("valid : %s\n", line);
  }else if(sscanf(line,"%d %s %d", &month, &day, &year) == 3){
    printf("valid : %s\n", line);
  }else{
    printf("invalid : %s\n", line);
  }
}
// ์ด ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด์„œ C์—์„œ validation์„ ํ•  ์ˆ˜ ์žˆ๋Š”
// ์‹ฌํ”Œํ•œ ์˜ˆ์‹œ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

sscanf๋Š” CLI์—์„œ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ ์• ์ดˆ์— ๋ฌธ์ž์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ฝ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

scanf : ํ„ฐ๋ฏธ๋„์—์„œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

int scanf(char *format, ...)

sscanf : ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

int sscanf(char *string, char *format, arg1, arg2, ...)

7.5. File Access

์—ฌ๊ธฐ์„œ๋Š” ํŒŒ์ผ์„ ์•ก์„ธ์Šคํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ๋‹ค. ์ด ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ cat์ด ์žˆ๋‹ค. cat์€ ์—ฌ๋Ÿฌ๊ฐœ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ๋ณด๋‚ธ๋‹ค. ์ฆ‰ ๋ช‡๊ฐœ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ชจ์•„์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

cat x.c y.c

๋Š” ํ„ฐ๋ฏธ๋„์— x.c ํŒŒ์ผ๊ณผ y.c์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ๋Š” x.c๋‚˜ y.c ๊ฐ™์€ ํŒŒ์ผ ์ด๋ฆ„์„ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋А๋ƒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทœ์น™์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์ „์— ํŒŒ์ผ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ fopen์— ์˜ํ•ด ์—ด๋ฆฌ๋ฉด ๋œ๋‹ค. fopen์€ x.c ๋”ฐ์œ„์˜ ์ด๋ฆ„์„ ๋ฐ›์•„๋“ค์—ฌ์„œ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ด ํฌ์ธํ„ฐ๋Š” ํŒŒ์ผ ํฌ์ธํ„ฐ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ํŒŒ์ผ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ๋ฒ„ํผ์˜ ์œ„์น˜์™€ ๋ฒ„ํผ ๋‚ด์—์„œ์˜ ๋ฌธ์ž์˜ ์œ„์น˜, ํŒŒ์ผ์ด ์ฝ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ์“ฐ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ธ์ง€, ์—๋Ÿฌ๋‚˜ EOF๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š์•˜๋Š”์ง€ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. <stdio.h>์— ์žˆ๋Š” ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ์ •์˜์— FILE์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ •์˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ์–ธ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

ํŒŒ์ผ ํฌ์ธํ„ฐ ์„ ์–ธ

FILE *fp; // ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋‹ค
FILE *fopen(char *name, char *mode);
// ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

FILE์€ ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ด๋ฆ„์ด๊ณ  typedef(๊ตฌ์กฐ์ฒด ์žฅ์—์„œ ๋ฐฐ์› ๋˜ ์ปค์Šคํ…€ ํƒ€์ž… ๋””ํŒŒ์ธ)์— ์˜ํ•ด ๊ตฌํ˜„๋œ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์—์„œ fopen์€

fp = fopen(name,mode);

์™€ ๊ฐ™์ด ์“ด๋‹ค.

fopen์˜ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ํŒŒ์ผ์˜ ์ด๋ฆ„์ด๊ณ , ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ mode์ธ๋ฐ r(read), w(write), a(append) ๊ฐ€ ์žˆ๋‹ค.

๋งŒ์ผ writing๊ณผ appending ์œ„ํ•œ ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด ํŒŒ์ผ์€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. writing์œผ๋กœ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ์„ ์—ด๋ฉด ๊ธฐ์กด์˜ ๋‚ด์šฉ์€ ์ง€์›Œ์ง„๋‹ค.

์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ฝ๋Š” ๊ฒƒ์€ ์—๋Ÿฌ์ด๋ฉฐ ์—๋Ÿฌ์—๋Š” ํ—ˆ๊ฐ€๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ฝ์„ ๊ฒฝ์šฐ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์›์ธ์ด ์žˆ๋‹ค. ๋งŒ์•ฝ ์—๋Ÿฌ๊ฐ€ ์žˆ์„ ๋•Œ fopen์€ NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์—ด๋ฆฐ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘ getc์™€ putc๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋‹ค.

getc

getc๋Š” ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ•œ๋ฌธ์ž์”ฉ ์ฝ์–ด ๋ฆฌํ„ดํ•œ๋‹ค. getc์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์˜ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํŒŒ์ผ์˜ ๋์ด๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด EOF๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

int getc(FILE *fp)

putc

putc๋Š” ๋ฌธ์ž c๋ฅผ fpํŒŒ์ผ๋กœ ์“ฐ๊ณ  ์“ฐ์—ฌ์ง„ ๋ฌธ์ž๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด EOF๋ฅผ ์“ฐ๊ณ  EOF๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

int putc(int c, FILE *fp)

Cํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜์Œ ์ˆ˜ํ–‰๋  ๋•Œ OSํ™˜๊ฒฝ์€ ์„ธ๊ฐœ์˜ ํŒŒ์ผ์„ ์ž๋™์ ์œผ๋กœ ์—ด๊ณ  ์„ธ๊ฐœ ํŒŒ์ผ์„ ์ดใ…œํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐฐ์ •ํ•œ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ ํ‘œ์ค€์ถœ๋ ฅ, ํ‘œ์ค€ ์ž…๋ ฅ๊ณผ ํ‘œ์ค€ ์—๋Ÿฌ ์ถœ๋ ฅ์ด๋‹ค.

์ด์— ๋Œ€์‘ํ•˜๋Š” ํŒŒ์ผ ํฌ์ธํ„ฐ๋Š” stdin, stdout, stdeff๋กœ ๋ถˆ๋ฆฌ๊ณ  <stdio.h>์—์„œ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ๋Œ€๊ฐœ stdin์€ ํ‚ค๋ณด๋“œ๋กœ ๋ฐ›๊ณ  stdout, stderr์€ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•˜์ง€๋งŒ ํŒŒ์ผ์ด๋‚˜ ํŒŒ์ดํ”„๋กœ ์ถœ๋ ฅ๋˜๋Š” ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

getchar์™€ putchar๋Š” getc, putc, stdin, stdout์œผ๋กœ ์ •์˜๋  ์ˆ˜๋„ ์žˆ๋‹ค.

#define getchar() getc(stdin)
#define putchar(c) putc((c),stdout)
//getchar()๋ผ๋Š” ํ•จ์ˆ˜์— getc(stdin)์„ ํ• ๋‹นํ•œ ๊ฑฐ๋‹ค.
//putchar(c)๋ผ๋Š” ํ•จ์ˆ˜์— putc((c),stdout)์„ ํ• ๋‹นํ•œ ๊ฑฐ๋‹ค.

ํŒŒ์ผ์˜ ์ •ํ˜•ํ™”๋œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด fscanf, fprintf๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํŒŒ์ผ์˜ ํฌ์ธํ„ฐ์ธ ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด scanf, printf์™€ ๊ฐ™๋‹ค. ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํฌ๋งท๋ฌธ์ž์—ด์ด๋‹ค.

int fscanf(FILE *fp, char *format, ...)
int fprintf(FILE *fp, char *format, ...)

์ด๋Ÿฐ ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด์ œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” catํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ CLI์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋“ค์€ ํŒŒ์ผ์ด๋ฆ„์ด๋‚˜ ๊ธฐํƒ€ ์ง€์‹œ๋ฅผ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ํ•ด์„๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

#include <stdio.h>

main(int argc, char *argv[]){
  FILE *fp;
  void filecopy(FILE *, FILE *);

  if(argc==1)
    // 5์žฅ์—์„œ ๋ฐฐ์šด๊ฒƒ์ฒ˜๋Ÿผ argv[0]์€ ์ž๊ธฐ ์ž์‹ ์˜ ์ด๋ฆ„์ด๋‹ค.
    // ๋”ฐ๋ผ์„œ argc ์ฆ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐฏ์ˆ˜๊ฐ€ 1์ด๋ผ๋ฉด
    // ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ฌด ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋“ค์–ด์˜ค์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.
    filecopy(stdin,stdout);
    // ์ด ๋•Œ๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ํ„ฐ๋ฏธ๋„์—์„œ ํ•œ๋‹ค.
  else
    while(--argc>0){
      if((fp = fopen(*++argv,"r")) == NULL){
        // ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์—†๋‹ค๊ณ  ์ถœ๋ ฅํ•ด์ค€๋‹ค.
        printf("cat : can't open %s\n", *argv);
        return 1;
      }else{
        filecopy(fp,stdout);
        // ์—ฌ๊ธฐ์„œ๋Š” ํ‘œ์ค€์ถœ๋ ฅ(์ฆ‰ ํ„ฐ๋ฏธ๋„)์— ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์นดํ”ผ,
        // ์ฆ‰ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ๋‹ค.
        // ์ฆ‰ stdout์„ ํŒŒ์ผ ์ทจ๊ธ‰ํ–ˆ๋‹ค.
        // ๋‚ด๋ถ€์ ์œผ๋กœ stdout์€ ๋ฐ›์€ ๋ฌธ์ž์—ด์„
        // ํ„ฐ๋ฏธ๋„๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
        fclose(fp);
      }
    }
  return 0;
}

void filecopy(FILE *ifp, FILE *ofp){
  // ifp : input file pointer
  // ofp : output file pointer
  int c;
  while((c=getc(ifp))!=EOF){
    putc(c,ofp);
  }
}

๋‹ค์Œ์˜ ํ•จ์ˆ˜ fclose๋Š”

int fclose(FILE *fp)

fopen์˜ ์—ญ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค. ์ด ํ•จ์ˆ˜๋Š” fopen์— ์˜ํ•ด ์„ค์ •๋œ external name๊ณผ ํŒŒ์ผ ํฌ์ธํ„ฐ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ•ด์ œํ•˜๊ณ  ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ putc์˜ ์ถœ๋ ฅ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฒ„ํผ๋ฅผ ์—†์•  ์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. fclose๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ๋๋‚ฌ์„ ๋•Œ๋Š” ๊ฐ์ž์˜ ์—ด๋ฆฐ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž๋™์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ์ฆ‰ ์ž๋™์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ํ•ด์ œํ•œ๋‹ค.

7.6. Error Handllng-Stderr and Exit

catํ•จ์ˆ˜์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์€ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š๋‹ค. ๋งŒ์•ฝ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์„ ๋•Œ, ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฌธ์˜ ๋์—์„œ ๋‚˜ํƒ€๋‚œ๋‹ค. ์ถœ๋ ฅ์„ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ํŒŒ์ผ๋กœ ์ €์žฅํ–ˆ๋‹ค๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ๊ณค๋ž€ํ•˜๋‹ค.

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ stderr๋กœ ๋ถˆ๋ฆฌ๋Š” ๋˜ ํ•˜๋‚˜์˜ stream์„ stdin, stdout๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ• ๋‹นํ•˜์ž. ์ถœ๋ ฅ์„ ํ„ฐ๋ฏธ๋„ ๋˜๋Š” ํŒŒ์ผ ์–ด๋””๋กœ ์ง€์ •ํ•˜๋“  stderr์˜ ์—๋Ÿฌ๋ฌธ์€ ํ„ฐ๋ฏธ๋„์— ๋‚˜ํƒ€๋‚œ๋‹ค.

#include <stdio.h>

main(int argc, char *argv[]){
  FILE *fp;
  void filecopy(FILE *, FILE *);
  char *prog = argv[0];
  // prog๋Š” ์—๋Ÿฌ ์ถœ๋ ฅ์‹œ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ํ• ๋‹นํ–ˆ๋‹ค.

  if(argc==1)
    filecopy(stdin,stdout);
  else
    while(--argc>0){
      if((fp = fopen(*++argv,"r")) == NULL){
        // ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์—†๋‹ค๊ณ  ์ถœ๋ ฅํ•ด์ค€๋‹ค.
        fprintf(stderr,"%s : can't open %s\n",prog,*argv);
        // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„๊ณผ
        // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ํŒŒ์ผ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
        exit(1);  
      }else{
        filecopy(fp,stdout);
        fclose(fp);
      }
    }
  if(ferror(stdout)){
    fprintf(stderr, "%s: error writing stdout\n", prog);
    exit(2)
  }
  exit(0);
}

ํ”„๋กœ๊ทธ๋žจ์€ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์•Œ๋ฆฐ๋‹ค.

์ฒซ์งธ, fprintf์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ stderr๋กœ ๋ณด๋‚ด๋ฉด ํ„ฐ๋ฏธ๋„์— ๋‚˜ํƒ€๋‚˜๊ฒŒ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์„ argv[0]์œผ๋กœ ๋ถ€ํ„ฐ ํฌํ•จํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋”๋ผ๋„ ์—๋Ÿฌ์˜ ๊ทผ์›์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‘˜์งธ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ exit์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์ด ํ˜ธ์ถœ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰์ด ๋๋‚˜๊ฒŒ ๋œ๋‹ค. exit์˜ ๋ฆฌํ„ด ๊ฐ’์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰์˜ ์„ฑ๊ณต์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. exit์ด 0์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  ๊ฒŒ ์ž˜๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ณ , 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋น„์ •์ƒ์ ์ด๋ผ๋Š” ๋œป์ด๋‹ค. exit์€ ์—ด๋ฆฐ ํŒŒ์ผ์— ๋Œ€ํ•ด fclose๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ฒ„ํผ๋ฅผ ์ง€์šฐ๊ณ  ํŒŒ์ผ์„ ๋‹ซ๋Š”๋‹ค.

throw์˜ ์ „์‹  ๊ฐ™๋‹ค!

mainํ•จ์ˆ˜์— return expr ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜ exit(expr)์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ™์€ ํ‘œํ˜„์ด๋‹ค. exit์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์œ ๋ฆฌํ•œ ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ferror๋Š” fp์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค(๊ทธ๋ž˜์„œ ์œ„์˜ ์กฐ๊ฑด๋ฌธ์‹์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค).

์ถœ๋ ฅ ์—๋Ÿฌ๋Š” ๋งค์šฐ ๋“œ๋ฌผ๊ธด ํ•˜์ง€๋งŒ ์ €์žฅ๊ณต๊ฐ„(HDD)์ด ๊ฝ‰์ฐจ์žˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์ ์„ ์ž˜ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค. feof(FILE *)๋Š” ferror์˜ ์œ ์‚ฌํ˜•์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์˜ ๋์„ ๋ฐœ๊ฒฌํ•˜๋ฉด 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค(EOF!).

7.7. Line Input and Output

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด์ „ ์žฅ๋“ค์—์„œ ์‚ฌ์šฉํ•œ getline ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ fgets ์ž…๋ ฅํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

char *fgets(char *line, int maxline, FILE *fp)

fgets๋Š” ๋‹ค์Œ ๋ผ์ธ(\n๋ฅผ ํฌํ•จํ•œ)์„ ํŒŒ์ผ fp๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์ธ line์— ์ฝ์–ด ๋“ค์ด๋Š”๋ฐ, ์ตœ๋Œ€ maxline-1 ์˜ ๋ฌธ์ž๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ ์™„๋ฃŒ๋œ ๋ผ์ธ์€ '\0'์— ์˜ํ•ด ์ข…๋ฃŒ๋œ๋‹ค. ๋ณดํ†ต fgets๋Š” line์„ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, ํŒŒ์ผ์˜ ใ„ฒ๋์ด๊ฑฐ๋‚˜ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ์„ ์‹œ์—๋Š” NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์ถœ๋ ฅํ•จ์ˆ˜ fputs๋Š” '\0'์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์„ ํŒŒ์ผ์— ์ถœ๋ ฅ์‹œํ‚จ๋‹ค.

int fputs(char *line, FILE *fp)

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด EOF๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์—๋Š” 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.

gets์™€ puts๋Š” stdin๊ณผ stdout๊ณผ stdout์— ์ž‘์šฉ๋œ๋‹ค๋Š” ์ ์ด fgets, fputs์™€ ๋‹ค๋ฅธ์ ์ด๋‹ค(fgets, fputs์˜ f๊ฐ€ ์ƒ์ง•ํ•˜๋“ฏ ์ด ํ•จ์ˆ˜๋“ค์€ ํŒŒ์ผ์— ์ ์šฉ๋œ๋‹ค). gets๋Š” ๋งˆ์ง€๋ง‰์˜ '\n'์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ puts๋Š” ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

char *fgets(char *s, int n, FILE *iop){
  // iop๋ผ๋Š” ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ผ์ธ s๋ฅผ ์ตœ๋Œ€ ๊ธธ์ด n๊นŒ์ง€ ์ฝ๊ณ , ์ฝ์€ ๋ผ์ธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
  register int c;
  register char *cs;
  cs = s;
  while(--n > 0 && (c=getc(iop)) != EOF)
    // n ์€ maxline์ด๋ฏ€๋กœ maxline๊ฐœ ๊นŒ์ง€๋งŒ ๋ฐ›๋Š”๋‹ค.
    // c ๋Š” ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ›๋Š”๋‹ค.
    if((*cs++ = c) == '\n')
      // cs๋ผ๋Š” ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค์— c๋ฅผ ์ €์žฅํ•˜๊ณ  1์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.
      // ๊ทธ๋Ÿฐ๋ฐ ๋™์‹œ์— ์ด๊ฒŒ '\n'์ด ์—ˆ๋‹ค๋ฉด ๋ผ์ธ์˜ ๋์ด๋ฏ€๋กœ ์ข…๋ฃŒํ•œ๋‹ค.
      break;
    *cs = '\0';
    // ๋งˆ์ง€๋ง‰์—๋Š” \0์„ ํ• ๋‹นํ•œ๋‹ค.
    return (c == EOF && cs == s) ? NULL : s;
    // ๋์ด ๋‚ฌ๋”ฐ๋ฉด null์„ ๋ฆฌํ„ด, ์•„๋‹ˆ๋ผ๋ฉด ๋ผ์ธ์„ ๋ฆฌํ„ดํ•œ๋‹ค.
}

char *fputs(char *s, FILE *iop){
  int c;

  while(c = *s++){
    putc(c,iop);
    // ๋ผ์ธ s์—์„œ '\0'์ด ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€ ํ•œ๊ธ€์ž์”ฉ์ฝ์–ด iop์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.
  }
  return ferror(iop) ? EOF : 0;
}

fgets๋ฅผ ์‚ฌ์šฉํ•ด์„œ getline์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š๋‹ค.

int getline(char *line, int max){
  if(fgets(line,max,stdin) == NULL){
    return 0;
  }else{
    return strlen(line);
  }
}

7.8. Miscellaneous Functions

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ์ ˆ์—์„œ๋Š” ๊ทธ์ค‘ ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ๋‹ค.

๋ฌธ์ž์—ด ์กฐ์ž‘

<string.h>์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์—์„œ s,t ๋Š” char * ์ด๊ณ , c์™€ n์€ int์ด๋‹ค.

ํ•จ์ˆ˜

๊ธฐ๋Šฅ

strcat(s,t)

t๋ฅผ s์˜ ๋์— ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

strncat(s,t,n)

t์ค‘ n๊ฐœ์˜ ๋ฌธ์ž๋ฅผ s์˜ ๋์— ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

strcmp(s,t)

s-t๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

strncmp(s,t,n)

strcmp์™€ ๊ฐ™์ง€๋งŒ ์ฒ˜์Œ n๊ฐœ์˜ ๋ฌธ์ž๋งŒ์ด ๋Œ€์ƒ์ด๋‹ค.

strcpy(s,t)

s์— t๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.

strncpy(s,t,n)

t์˜ n๊ฐœ ๋ฌธ์ž๋ฅผ s์— ๋ณต์‚ฌํ•œ๋‹ค.

strlen(s)

s์˜ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

strchr(s,c)

s์—์„œ ์ฒ˜์Œ ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ž c์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค.

strrchr(s,c)

s์—์„œ ๋งˆ์ง€๋ง‰์— ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ž c์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค.

๋ฌธ์ž๋ถ„๋ฅ˜์™€ ๋ณ€ํ™˜

<ctype.h>์˜ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. c๋Š” unsigned char๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” int๊ฑฐ๋‚˜ EOF์ด๋‹ค. `

Last updated

Was this helpful?