Nagie's DevStory
[C] 30. 문자열 다루기 본문
문자열이란 문자를 여러 개 이어 붙인 형태의 자료이며 문자열을 저장하기 위해선 연속적인 메모리 공간이 필요하다.
즉 배열이 필요하다는 의미이며 C에서 지원하는 문자열 방식은 총 2가지가 있다.
1. char 타입의 배열을 선언 후 문자열 삽입
2. char 타입의 포인터를 선언 후 문자열 리터럴을 해당 포인터에 할당
문자열을 다루는 방법의 예시는 아래와 같다.
char str[17] = "C Style String 1"; //배열타입 1
char str[] = "C Style String 2"; //배열타입 2
char* str1 = "C Style String 3"; //리터럴 시작 부분의 메모리 주소를 포인터변수에 할당
const char* str2 = "C Style String 4"; //문자열 리터럴을 포인터변수에 할당 후 상수화
다만 각각의 문자열을 다루는 방법에서 차이점이 있는데
배열로 다루게 되면 문자열을 이루는 원소
즉 문자를 중간중간 변경시킬 수 있고 아예 새로운 문자열로 덮어씌울 수 있다.
사용 예시는 아래와 같다. 아래의 방법을 사용하게 되면 문자열 데이터를 자유롭게 사용할 수 있다.
//strcpy 함수 사용
char str[100] = "C Style String 1";
strcpy_s(str,100,"String Changed!"); // <string.h>를 소스에 포함해야한다.
//배열 인덱스 사용
str[0] = 'S';
str[1] = 't';
str[2] = 'r';
str[3] = 'i';
str[4] = 'n';
str[5] = 'g';
str[6] = ' ';
str[7] = 'C';
str[8] = 'h';
str[9] = 'a';
str[10] = 'n';
str[11] = 'g';
str[12] = 'e';
str[13] = 'd';
str[14] = '\0';
마지막으로 배열로 접근하는 방법이 아닌 포인터 변수를 사용한 문자열 사용 방법이다.
해당 방법은 배열로 다루는 문자열처럼 문자열의 원소를 바꿀 수 없지만
기존의 문자열을 다른 문자열로 덮어쓰는 방식은 사용할 수 있다.
사용 방법은 아래와 같다.
char* str = "C Style String 2";
str = "String Changed!";
다만 위의 방법으론 문자열을 이루는 원소를 바꿀 수 없어서
"읽기 전용"이라는 표현으로 정보를 공유하는 경우가 종종 보이는데 이건 잘못된 표현이다.
정말 "읽기 전용"으로 만들려면 포인터에 const 키워드를 붙여 상수화해야 한다.
char* const str = "C Style String 3"; //문자열 변경 불가
const char* str = "C Style String 3"; //다른 문자열로 덮어쓰는 방법으로 변경 가능
const 키워드의 자리에 따라 문자열이 변경이 가능하니 자리를 유의해 사용하도록 하자.
그리고 C 스타일 문자열은 문자열 끝에 해당 문자열의 끝을 알리는 '\0' (널 문자)가 붙어 1Byte의 용량이 더 필요하다.
즉 char 배열의 길이를 100으로 선언했다면 문자 100개를 다 채울 수 있는 게 아닌 99개를 채울 수 있다는 이야기다.
타 언어는 모르겠지만 C에서 문자열을 다루는 건 상당히 까다롭다. 그것도 영문이 아니라면 더더욱 까다롭기 때문에
기본 원리를 잘 이해하고 넘어가야 한다.