그 놀라운 이야기들...

살아 숨쉬는 코드들을 만들어 봅니다. 조심하세요. 날아갈 수도 있으니...

삶이 어떻게 더... 완벽해~

프로그래밍 언어/C

[C언어:초급-011] 문자열

신코더 2022. 3. 9. 22:28
반응형

1. 문자열 타입?

많은 분들이 의아해 할지 모르지만, C 에는 문자열 타입이란 없다. C 에서 타입이라고 하면 정수, 실수, 포인터, 구조체 정도만 있을 뿐이다. 그럼 문자열은 어떻게 처리를 해야할까? 그 방법을 알아보도록 하자. 

 

2. 문자열 구조

우리는 상수 강좌에서 문자열 상수의 표현법을 배웠었다. 그러나 실질적으로 사용되는 문자열의 메모리 구조는 다음과 같다.

 

    "Hello"   =>   [H] [e] [l] [l] [o] [0]  // 마지막 숫자 ‘0’은 문자열의 끝을 알려주는 표시. 문자열 종결자.

 

그러므로 어떤 문자열을 사용하기 위해서는 메모리 상에 그 ‘문자열의 길이’ + 1 개의 바이트 더 필요하다. 만약에 마지막 바이트에 ‘0’ 숫자가 없다면 컴퓨터는 문자열이 다음의 ‘0’ 숫자가 나올 때까지 문자열이 계속 되는 것으로 인식한다. 그럼 예기치 않은 오류들이 발생할 것이니 주의해야 한다. 그러니 문자열을 상수로 표현할 경우에는 C 컴파일러가 자동적으로 맨 뒤에 ‘0’을 추가해 줄 것이니 걱정하지 않아도 된다.

 

3. 문자열 포인터

프로그램에서는 문자열 상수 그 자체 만으로는 아무것도 할 수 없으므로 이를 변수에 담을 수 있는 방법이 필요하다. C에서 문자열 사용하기 위해서 쓰이는 기본적인 타입은, 각 영문자당 1 바이트 크기를 가지는 char 타입이다. 1열로 나열된 여러개의 char 타입에 문자열을 순서대로 담고 맨 첫번째 바이트의 주소를 포인터 변수에 담아 사용한다. 다음의 “Hello”라는 문자열을 포인터 변수에 담는 방법을 보여준다.

 

    char* str = "Hello";    // [H] [e] [l] [l] [o] [0]

                                          // ^ str 포인터에 저장되는 주소값

 

 

우리는 이제 “Hello” 문자열의 주소값을 알아냈으므로 이 주소값을 이용하여 다양한 용도로 활용할 수 있게 됐다. 

 

4. printf() 함수 활용

우리는 printf() 함수에 대해서 아직 배운바는 없지만 지금까지 게속 예제를 통해 사용해 왔다. 외국어를 공부하다 보면 어떤 단어는 한 번도 배운적이 없는데 계속 듣다 보면 그 뜻을 저절로 알게되는 경우가 있다. 이와 마찬가지로 프로그램에서도 어떤 함수나 기능들은 특별히 배우지 않더라도 자꾸 쓰다보면 알게되는 경우가 있다. printf()함수가 아마도 그런 경우가 되지 않을까 기대를 해 본다. 그렇더라도 잠깐 간단한 설명 정도는 하고 넘어가고자 한다. printf()함수의 기본형식은 다음과 같다.

 

    printf(<문자열 포맷> [, 파라미터...]);

 

    printf() : 문자열 포맷의 내용을 표준 출력장치(콘솔)에 출력한다. 

    문자열 포맷 : 정해진 형식에 따라 출력 모양새를 정한다. 파라미터와 매칭이 되도록 대체 형식들을 지정할 수 있다. 주로 많이 쓰이는 대체 형식들은 다음과 같은 것들이 있다.

            %d : int 타입의 정수

            %f : float 타입의 실수

            %p : 포인터

            %s : 문자열 

    파라미터 : 문자열 포맷 내에 있는 대체 형식의 갯수와 타입에 맞춰 변수나 상수등을 나열한다. 

 

5. 제어문자(Control Character)

문자열에는 알파벳이나 기호등 눈으로 볼 수 있는 문자들도 들어가지만 눈에 보이지않는 제어 문자들이 들어갈 수 있다. 제어 문자들은 ASCII 코드 31 이하의 코드들로 구성되어 있으며 각각의 문자들 마다 표준으로 정해진 기능들이 있다. 여기서는 이들중 자주 쓰이는 몇가지만 소개하도록 한다.

    '\n' : 개행문자(new line). 이 문자를 만나면 다음 라인 첫번째 컬럼으로 이동한다.

    '\r' : 엔터/리턴. 해당 줄의 출력( or 입력)을 마치고 맨 앞으로 되돌아감

    '\t' : 시스템이 정한 위치만큼 건너뛰어 이동함(문자열을 해석하는 시스템에 따라 다름)

    '\b' : 백스페이스. 이전 문자 하나를 지우면서 한 문자 전으로 이동함.

 

다음은 printf()함수를 활용한 문자열 포인터의 사용법에 대한 예제이다.

#include <stdio.h>

int main()
{
    char *name = "Maria";
    int age = 25;
    char *ask = "I live in %s.\n";
    
    printf("Hello %s!\n", name);  // %s는 문자열 대체 형식. 여기서는 name 변수의 내용이 대체된다.
    printf("I am %d years old.\n", age); // %d는 정수 대체형식. age 값이 대채된다.
    printf(ask, "Seoul"); // 포맷이 문자열 포인터 변수로, 파라미터가 상수로 올수도 있다.
}

   

 

'프로그래밍 언어 > C' 카테고리의 다른 글

[C언어:초급-013] 문자열 조작  (0) 2022.03.14
[C언어:초급-012] 배열과 포인터  (0) 2022.03.11
[C언어:초급-010] 포인터 기초  (0) 2022.03.09
[C언어:초급-009] 배열  (0) 2022.03.07
[C언어:초급-008] 상수  (0) 2022.03.06