C언어 문자열 입출력 – C언어 강의 5

C언어 문자열

C언어에서는 문자열의 입출력을 처리하는 여러가지 함수를 제공합니다. printf 와 scanf 를 자주 사용하게 될텐데 좀 번거로운 부분도 있지만 나중에는 좀더 쉬운 방법들을 스스로 찾을 수 있을겁니다.

C언어는 문자열을 나타내는 타입이 없습니다. 정확하게 이야기하면 문자형은 char type 이고 문자열을 char 타입의 배열입니다. 이것의 정확한 의미는 C의 포인터에 대하여 학습해야 알 수 있는데 지금은 char 형 문자를 여러개 붙여서 문자열이 된다는 정도로 충분합니다.

입출력 예제

예제를 통해서 간단한 입출력을 수행하는 코드를 작성해 보겠습니다.

#include <stdio.h>

int main(void){

    char name[20];

    printf("Hello! What's your name?\n");
    scanf("%s",name);
    printf("Welcome! %s!\n",name);

    return 0;
}
*실행결과
Hello! What's your name?
masterkay
Welcome! masterkay!

Hello World 를 작성했던 전통의 printf 함수로 문자열을 출력합니다. “” 큰따옴표 안에 있는 것은 모두 문자열로 출력이 되는데 여기서 \n 가 나오면 문자열 출력을 멈추고 \n 에 해당하는 동작을 실행합니다. \n은 한라인아래로 내려가서 그 줄의 맨 처음으로 커서가 돌아가도록 명령합니다. 이것을 이스케이프 시퀀스라고 하는데 이 동작이 끝나면 다시 나머지 문자열이 출력됩니다.

scanf 는 printf와 쌍을 이루는 함수입니다. 표준입력으로부터 입력을 받습니다. %s는 scanf 함수가 받는 자료의 형이 문자열임을 의미합니다. %d 는 숫자 %c 는 문자 이런 식으로 표기합니다. char 형 배열 name이 들어가는데 이는 실제로는 배열의 주소를 전달합니다.

주의할 점은 char 형은 1바이트기 때문에 아스키 코드만 사용할 수 있습니다. 한글이나 다른 유니코드를 사용하기 위해서는 다른 방법을 사용해야 합니다. %c를 두개 붙여서 콘솔에 문자를 출력하는 방법이 있지만 char를 유니코드를 처리하기 위한 wchar 로 바꾸는 등 별도의 처리가 필요합니다.

C언어에서 한글이나 다른 언어의 입출력을 처리하는 것은 다른 현대의 언어들보다 좀 까다롭습니다. 그래서 웬만하면 C언어의 예제는 영어로 하도록 합니다.

scanf 함수는 연속으로 여러개의 문자열을 입력받을 수 있습니다. %s %s 는 공백문자를 기준으로 두개의 문자열을 입력 받습니다.

#include <stdio.h>

int main(void){

    char fstName[20];
    char lstName[20];

    printf("Hello! What's your first and last name?\n");
    scanf("%s %s",fstName, lstName);
    printf("Welcome! %s %s\n", fstName, lstName);

    return 0;
}
Hello! What's your first and last name?
John Smith
Welcome! John Smith

C 문자열의 원리

C언어는 기본으로 char 형을 지원합니다. char형은 8bit 로 아스키코드로 char 형의 범위는 limits.h 에 정의되어 있습니다. -128 ~ 127까지의 값이죠.

각각의 숫자가 뜻하는 것은 아스키 코드표에 나와있습니다.

아스키 코드표 (ASCII CODE) 코딩지식 1

예를 들어서 char 타입 변수의 값 0100 0001(이진수)는 십진수로 65이고 대문자 A를 의미합니다. 그렇다는 것은 이 char 들을 모으면 문자열이 됩니다.

아래 예제는 문자의 출력과 문자열의 출력입니다. 포인터 개념이 없어도 이정도는 이해할 수 있습니다.

CHAR_MIN은 char 의 최소값을 정의하고 CHAR_MAX는 char의 최대값을 정의합니다. 사용중이 시스템마다 차이가 있을 수 있습니다. 확인차원해서 한번 실행해 보면 됩니다.

#include <stdio.h>
#include <limits.h>

int main(void){

    char myChar = 65;

    printf("-> myChar : %c\n", myChar);
    char myString[20] = "C Language";

    printf("-> myString : %s\n", myString);

    printf("Mimimum Value: %d\n", CHAR_MIN);
    printf("Maximum Value: %d\n", CHAR_MAX);

    return 0;
}
-> myChar : A
-> myString : C Language
Mimimum Value: -128
Maximum Value: 127

문자열이 왜 문자를 배열에 넣은 것인지는 아래 예제를 통해 확실히 이해할 수 있습니다. 배열의 모든 인덱스를 루프해보면 C Language라는 영단어의 아스키 코드를 출력할 수 있습니다. 배열의 크기가 char [20]인데 좀 남는 부분은 0으로 초기화 되어 있습니다.

printf 함수가 하는 일이 배열을 읽어 올 때 처음 인덱스 0부터 시작해서 Null 값(즉 0)전까지 읽어옵니다. 0이 나오면 더이상 문자열 데이터가 없다 라는 뜻입니다.

#include <stdio.h>

int main(void){


    char myString[15] = "C Language";

    printf("-> myString : %s\n", myString);


    for (int i = 0; i < 15; i++)
    {
        printf("[%d] -> %d\n",i, myString[i]);
        /* code */
    }
    
    return 0;
}
-> myString : C Language
[0] -> 67
[1] -> 32
[2] -> 76
[3] -> 97
[4] -> 110
[5] -> 103
[6] -> 117
[7] -> 97
[8] -> 103
[9] -> 101
[10] -> 0
[11] -> 0
[12] -> 0
[13] -> 0
[14] -> 0

요약

C언어 문자열 입출력에 대해서 알아봤습니다.

여기서 캣치할 부분은 char 형 배열이 문자열이 된다는 것 입니다. 다른 언어 중에는 String 이라는 자료형을 만들어 놓는데 C언어에서는 없습니다. (기본 자료형은 아니라는 것)

배열이 문자열이란 것은 포인터를 학습하면서 그 의미를 제대로 알 수 있습니다. 문자열은 모든 컴퓨터 언어에서 가장 중요한 데이터타입이기도 합니다. 컴퓨터는 0과 1만으로 작동시킬 수 있지만 사람은 0과1 이외에 문자열을 읽으면서 정보를 파악합니다.

컴퓨터에서의 문자열 처리는 방대한 분야입니다. 언어를 처리하는 정규식 같은 것은 하나의 언어로 다루어지고 있습니다. C의 문자열을 제대로 알게되면 다른 언어의 문자열들 보다 훨씬 컴퓨터 메모리의 속사정을 파악하는데 도움이 됩니다.

천리길도 한걸음이고 첫술에 배부를 수 없으니 이제 시작이라는 마음으로 여유롭게 학습할 필요가 있습니다.

참고 웹문서

C Programming String – Programiz

Leave a Comment