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);
'C언어' 카테고리의 다른 글
[C]void 포인터에 자료형 할당하기 (0) | 2022.04.19 |
---|---|
[C] 구조체 메모리 크기 계산 빠르게 정리 (0) | 2022.04.18 |