본문 바로가기

C언어

[C] 문자열 포인터와 문자열 배열 정리

C언어에서는 직접적으로 문자열을 처리할 수 없다.

C++에서와 같이 string s1 = "Hello"; 와 같이 할 수 없다는 것이다.

그럼 어떻게 해야 할까?

 

 

변수에 직접적으로 저장하는 것이 아닌, 포인터를 이용한다.

char c1 = 'a';

#include <stdio.h>

int main(){
    char c1 = 'a';
    char *s1 = "hello";
    char s2[10] = "hello";
    char s3[6] = "hello";
    char s4[] = "hello";
}

 

s1은 문자열의 시작주솟값을 가지고 있다.

그리고 문자열의 끝은 항상 \0이다.

 

 

C언어는 문자열이 \0에서 끝이라는 것을 내부적으로 알고 있다.

그래서 printf는 문자열을 출력할 때 문자열을 계속 출력하다가 NULL에서 출력을 끝낸다.

읽기 전용이기 때문에 더 삽입을 하거나 값을 수정하거나 모두 불가능하다.

오로지 어느 위치에 무엇이 있느냐 정도의 읽는 것만 가능하다.

printf("%p", s1); // h의 주솟값       0x55bdf9519004 주솟값은 run할 때마다 달라짐
printf("%p", s1 + 1); // e의 주솟값   0x55bdf9519005

printf("%s", s1); // hello     
printf("%s", s1 + 1); // ello   

// s1[2] = 'a' 불가    
    
printf("%c", *s1); // h    
printf("%c", *(s1 + 1)); // e
printf("%c", s1[2]); // l

 

 

s1[i] = *(s1 + i) = i 번째 요소 값

 

 

10칸짜리 배열에 hello를 넣으면 나머지 부분은 NULL로 채운다.

위와 달리 s[1] = 'a'와 같이 수정이 가능하다. 

 

 

C언어에서는 문자열이라면 맨 뒤에 NULL을 꼭 붙여줘야 하는 약속이 있기 때문에,

만일 "hello"라는 문자열을 만들고 싶다면 최소한 필요한 배열 칸 수는 NULL까지 합하여 6칸을 필요로 한다

이를 자체적으로 char s4[ ]를 사용하면 자체적으로 알아서 최소한의 배열로 생성해준다.

 

 

문자열에 할당까지는 알겠다.

그렇다면 문자열 복사는 어떻게 해야할까?

 

 

strcpy(dst, src)  =>  dst = src 

 

dst에 src 내용을 할당하는 효과를 본다.

 

주의해야 할 점은 위에 말했듯이 char* dst는 수정이 불가하다. 

dst가 내용을 할당받아야 하기 때문에 이러한 경우는 자리를 마련해준다.

char src[10] = "Hello";
char dst[10];

strcpy(dst, src); // ok

char* src = "Hello";
char* dst = "";

strcpy(dst, src); // no!!

 

포인터에는 malloc 함수로 원하는 만큼 메모리를 할당할 수 있다.

아래는 malloc를 사용하여 char 크기가 들어갈 10자리를 만들어줬다.

malloc을 사용하는 경우는 반드시 free를 해주어야 한다.

char *src = "Hello";
char *dst = malloc(sizeof(char) * 10);

strcpy(dst, src);

free(dst);