Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 39. 문자열 사용하기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 39. 문자열 사용하기

개발새발 문타쿠 2023. 9. 24. 16:48

INTRO

C언어에서 문자 자료형인 char는 있지만 문자열을 저장하는 자료형은 없다.

-> char에 문자열을 저장하면 컴파일은 되지만 실행은 ㄴㄴ


39.1 문자와 문자열 포인터 알아보기

그래서 문자열은 어떻게 사용하는가?

-> 문자열은 변수에 직접 저장하지 않고 포인터를 이용해서 저장

-> 문자열은 char 포인터 형식으로 사용

#include <stdio.h>

int main(void)
{
    char c1 = 'a';          // 변수 c1에 문자 'a' 저장
    printf("%c\n\n", c1);

    char* s1 = "Hello";     // 포인터 변수 s1에 문자열 "Hello"의 주소 저장
    printf("%p\n", s1);     // 포인터 변수 s1이 가지고 있는 주소 = 문자열 "Hello"의 주소
    printf("%s\n", s1);     // 포인터 변수 s1이 가지고 있는 주소의 문자열 = "Hello" 
    printf("%p\n", &s1);    // 포인터 변수 s1의 주소

    return 0;
}

  • 문자(a)는 변수 c1에 저장되지만, 포인터 변수 s1에는 문자열 리터럴(Hello)이 있는 곳의 메모리 주소만 저장된다.
  • 문자열 리터럴(Hello)이 있는 메모리 주소는 읽기 전용이므로 다른 문자열을 덮어쓸 수 없다.
  • C언어의 문자열 마지막에는 항상 널 문자(NULL=\0)가 붙는다.
  • 널 문자(NULL=\0)는 문자열의 끝을 나타내며, printf는 문자열을 출력할 때 문자열을 계속 출력하다가 NULL을 만나면 출력을 종료한다.

39.2 문자열 포인터에서 인덱스로 문자에 접근하기

#include <stdio.h>

int main(void)
{
    char* s1 = "Hello";

    printf("%c\n", s1[0]);
    printf("%c\n", s1[1]);
    printf("%c\n", s1[2]);
    printf("%c\n", s1[3]);
    printf("%c\n", s1[4]);
    printf("%c\n", s1[5]); // NULL(\0) 출력 -> 화면에 안보임

    return 0;
}


문자열  리터럴이 있는 메모리 주소는 읽기 전용이기 때문에, 문자열 포인터는 아래처럼 인덱스로 접근하여 문자를 할당하면 안된다.

#include <stdio.h>

int main(void)
{
    char* s1 = "Hello";

    s1[0] = 'A';

    printf("%c\n", s1[0]);

    return 0;
}

-> 오류발생


39.3 배열 형태로 문자열 선언하기

문자열은 char 배열에 저장할 수도 있다.

  • 배열을 선언한 즉시 문자열로 초기화하기
  • 배열의 크기는 할당한 문자열보다 크게 지정해야하며, 마지막에 NULL 값이 들어가야 하는 것도 생각하기
    • 배열의 최소 크기 = 할당한 글자의 개수 + 1(NULL)
#include <stdio.h>

int main(void)
{
    char s1[10] = "Hello";	// 최소 크기 = 6

    printf("%s\n", s1);

    return 0;
}

 

-> 아래와 같이 배열을 미리 선언해 놓고 문자열을 나중에 할당할 수 없음(컴파일 에러 발생)

#include <stdio.h>

int main(void)
{
    char s1[10];

    s1 = "Hello";

    printf("%s\n", s1);

    return 0;
}

 

-> 정 할당하고 싶으면 배열의 요소에 문자를 하나하나 집어넣어야 함

s1[0] = 'H';
s1[1] = 'e';
s1[2] = 'l';
s1[3] = 'l';
s1[4] = 'o';

 

-> 아래와 같이 문자 배열을 선언하면서 문자열을 바로 할당할 때는 배열의 크기를 생략할 수 있다.

-> 배열의 크기는 할당되는 문자열의 문자 개수 및 NULL 값을 생각하여 자동으로 지정됨

#include <stdio.h>

int main(void)
{
    char s1[] = "Hello";

    printf("%s\n", s1);

    return 0;
}

39.4 배열 형태의 문자열에서 인덱스로 문자에 접근하기

#include <stdio.h>

int main(void)
{
    char s1[10] = "Hello";

    printf("%c\n", s1[0]);
    printf("%c\n", s1[1]);
    printf("%c\n", s1[2]);
    printf("%c\n", s1[3]);
    printf("%c\n", s1[4]);
    printf("%c\n", s1[5]); // NULL(\0) 출력 -> 화면에 안보임

    return 0;
}


#include <stdio.h>

int main(void)
{
    char s1[10] = "Hello";

    s1[0] = 'A';

    printf("%s\n", s1);

    return 0;
}