ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kernighan - C] 1장 언어소개 - (5. 문자 입출력)
    전기전자공학/프로젝트 2017. 6. 24. 17:20

    1.5 문자 입출력


    문자들로 만들어진 파일은 C의 표준입출력 라이브러리에 있는 함수를 통해 문자들을 하나씩 처리할 수 있다.

    파일은 여러 개의 행으로 구성되어 있고, 행과 행 사이에는 개행 문자(\n)나 탭 문자 등이 있을 것이다.  

    파일 끝에는 파일의 끝임을 알려주는 기호( \0 )가 있는 데 화면 상에서는 보이지 않는다

    C로 파일을 처리하는 프로그램같은 경우 입력할 때 행의 길이나 피일의 길이는 신경 쓰지 않아도 된다 (- 왜?)


    stdio.h 에 있는 함수 중 문자 하나를 받아들이는 함수로 getchar가 있다.

    getchar() 호출 시 바로 다음에 입력되는 문자를 받게 된다.


    c = getchar()


    입력된 문자는 변수 c의 값에 할당 되고, 입력은 보통 키보드로 받는다.


    stdio.h 에서 문자 하나를 출력하는 함수로 putchar가 있다.


    putchar(c)

    변수 c의 내용이 문자로 모니터 상에 출력된다. c같은 경우 정수형 변수로도 사용될 수 있다.


    1.5.1 파일의 복사


    getchar와 putchar를 사용하면 입출력 프로그램을 작성할 수 있다.


    입력을 그대로 출력으로 내보내는 프로그램

     구조:

    ① 문자를 읽어 들임.

    ② while( 문자가 파일 끝 기호가 아닌 동안)

    ③ 문자를 출력

    ④ 다음 문자를 입력 받음

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    /* copy input to output; 1st ver */
    main() {
        int c;
     
        c = getchar();
        while ((c = getchar()) != EOF) {
            putchar(c);
        }
    }
    cs


    EOF는 <stdio.h>에서 정의되어 있고 #define 없이 사용될 수 있다


    c는 char형 이지만 정수형으로도 선언될 수 있다.

    그 이유는 파일 끝을 나타내는 기호(EOF) 때문인데,

    만일 c가 문자형으로 정의되어 있는 데 파일에서 -1과 같은 값이 들어오면 프로그램이 처리를 못하므로,

    c를 정수형으로 선언해 EOF를 인식할 수 있도록 한다.


    [예제 1-6] getchar() != EOF가 0 또는 1이 되는지 실험해보라.

    printf("%d\n", getchar != EOF);

    결과:

    콘솔에 1이 출력되었다.


    [예제 1-7] EOF의 값이 실제로 어떤 값인지 알아내는 프로그램을 작성하라.

    printf("%d\n", EOF);

    결과:

    콘솔에 -1이 출력되었다.



    1.5.2 문자의 갯수 세기


    문자 갯수 세기 프로그램

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h> // counting letter number program
     
    /* count characters in input; 1st version */
     
    main()
    {
        long nc;
        nc = 0;
        while (getchar() != EOF)
            ++nc;
        printf("%ld\n", nc);
    }
    cs


    이 프로그램에서 아주 많은 문자를 셀 수 있도록 nc는 long 형으로 선언했다.

    int형은 보통 16비트로 최대값이 32767인데, long형은 32비트의 값을 가진다.

    printf 출력양식 중 %ld가 변수 long형을 출력할 때 사용된다.


    long 형도 모자랄 만큼 큰 파일일 경우 double형으로 선언해주면 된다.


    1.5.3 행의 갯수 세기


    행의 갯수 세기 프로그램

    : 파일의 각 행 사이에 행을 바꾸는 기호(\n)가 있는 게 보통이므로,

     행의 갯수를 세기 위해 \n 갯수를 센다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    /* count lines in input */
     
    main()
    {
        int c, nl;
        nl = 0;
        while ((c = getchar()) != EOF)
            if (c == '\n')
                ++nl;
        printf("%d\n", nl);
    }
    cs



    어떤 문자에 작은 따옴표를 붙이면 그 문자에 해당하는 값을 알 수 있다.

    컴퓨터가 ASCII 문자를 사용할 때는 ASCII 코드 값을 알 수 있다.

    '\n'의 경우 하나의 문자로 취급되고, "\n"의 경우 문자 하나를 가진 문자열이다.


    [예제 1-8] 빈칸, tab과 행의 갯수를 세는 프로그램을 작성하라

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
     
    /* count spaces, tabs, and lines in input */
    main()
    {
        int c, ns, nt, nl;
        ns = nt = nl = 0;
     
        while ((c = getchar()) != EOF) {
            if (c == '\n')
                nl++;
            if (c == '\t')
                nt++;
            if (c == ' ')
                ns++;
        }
     
        printf("spaces: %d\t tabs: %d\t lines:%d\t\n", ns, nt, nl);
    }
    cs

    [예제 1-9] 한 파일을 읽어서 그 중 빈칸에 연달아 나오면 그것을 모두 한 칸으로 만들어 출력하는 프로그램을 작성하라.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <stdio.h>
    #define MAXLINE 1000
     
    int getline(char[], int);
    void space(char[], char[]);
     
    main()
    {
        char s[1024];
        char ch[1024];
        while (getline(s, MAXLINE) > 0 )
        {
            space(ch,s);
            printf("%s", ch);
        }
    }
     
    int getline(char s[], int lim) {
        int c, i;
     
        for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
            s[i] = c;
        
        if (c == '\n')
        {
            s[i] = c;
            i++;
        }
        s[i] = '\0';
        
        return i;
    }
     
    void space(char to[], char from[])
    {
        int i, j = 0;
        for (i = 0; from[i] != '\0'; i++)
        {
            if (from[i] == ' ' && from[i + 1== ' ')
            {
                to[j] = ' ';
                i++;
            }
            else
                to[j] = from[i];
            j++;
        }
        to[j] = '\0';
            
    }
     
    cs

    [예제 1-10] 한 파일을 읽어서 그 중에 tab이 있으면 그것을 \t, backspace가 있으면 \b, 

                   그리고 \가 있으면 \\로 대치해서 출력하는 프로그램을 작성하라

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /*
     * Filename:    change.c
     * Author:        Ssong24
     * Date:        24-Jun-2017
     *
     * The C Programming Language, second edition, Korean ver
     * by Kernighan and Ritchie
     * 
     * Exercise 1- 10, page 29
     */
     
    #include <stdio.h>
     
    main()
    {
        int c;
     
        while ((c = getchar()) != EOF) {
            if (c == '\t')
                printf("\\t");
            else if (c == '\b')
                printf("\\b");
            else if (c == '\\')
                printf("\\\\"); // \\ -> \로 출력됨
            else
                putchar(c);
        }
    }
    cs


    1.5.4 단어 갯수 세기


    ● 단어 갯수 세기 프로그램

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
     
    #define IN 1    /* inside a word */
    #define OUT 0    /* outside a word */
     
    /* count lines, words, and characters in input */
    main() {
        int c, nl, nw, nc, state;
     
        state = OUT;
        nl = nw = nc = 0;
        
        while ((c = getchar()) != EOF) {
            ++nc;
            if (c == '\n')
                ++nl;
            if (c == ' ' || c == '\n' || c == '\t')
                state = OUT;
            else if (state = OUT) {
                state = IN;
                ++nw;
            }
        }
        printf("%d %d %d\n", nl, nw, nc);
    }
    cs


    [예제 1- 11] 위의 프로그램이 오동작을 하도록 하는 입력파일을 만들어 보라


    [예제 1- 12] 파일을 읽어 한 행에 한 단어씩 출력하는 프로그램을 작성해 보라.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    main()
    {
            int c;
            while( (c = getchar()) != EOF) {
                    putchar(c);
                    if( c == ' ' || c =='\t')
                            printf("\n");
            }
    }
    cs



    댓글

Designed by Tistory.