프로그래밍 언어/C

문자열(String)

gcreators 2024. 8. 14. 17:19

기존에 문자는

char형을 이용해서 문자를 출력했다

char c = 'c';
printf("c: %c \n", c);

 

문자열을 출력하려면 하나의 문자만을 출력하는 char형 배열을 선언해서 출력을 했는데

char cStr[] = {
    'H', 'e', 'l', 'l', 'o', ',' , ' ',
    'W', 'o', 'r', 'l', 'd', '!'
};

int sStrLen = sizeof(cStr) / sizeof(cStr[0]);
// sizeof(cStr) / sizeof(cStr[0]); 배열의 길이를 구하는 식, 
// char형은 1byte의 크기라서 이렇게 나눠줄 필요가 없이 sizeof(cStr) 만으로 충분하다

printf("for문으로 c배열을 출력 : ");
for (int i = 0; i < sStrLen; i++)
{
    printf("%c", cStr[i]);
}
printf("\n");

 

이렇게 문자열을 계속해서 출력하기엔 너무 불편하여

문자열을 출력하는 방법을 따로 만들었다

 

char* str = "Hello, World!"; 
printf("str: %s\n", str);//%s : 문자열을 출력하는 출력기호

char* 는 포인터를 통해서 문자열을 가리킬 수 있다

여기서 변수 str은 메모리에 저장된 Hello, World!의 첫 요소인 H가 담긴 주소를 가리키고 있는 것 이다.

 

그런데 여기서 알아둬야 할 점이 있다.

for문을 통해 char형 배열에 담긴 문자열을 출력하면 그 끝을 우리가 정해두고 출력을 하지만

%s는 대체 어떤 원리로 문자열을 출력하는 것일까? 

 

주소의 시작지점은 첫 요소를 보면 알 수 있지만 그 끝은 어디까지인지 어떻게 아는 것 일까?

 

그 정답은 우리가 입력해둔 문자열 값에 마우스 포인터를 올려보면 알 수 있다.

printf("cStr Length: %d\n", sizeof(cStr));

우리가 선언한 배열의 길이가 13 즉, Hello, World! 라는 문자열을 담은 배열의 크기는 13이다

하지만 프로그램이 만든 char 공간은 14, 뭔가가 하나 더 있다는 것이다.

 

여기서

printf("str: %s\n", str);
printf("cStr: %s\n", cStr);

해당 코드를 통해 출력을 해보면

이런 결과가 나오는 것을 알 수 있다.

우리가 선언한 배열로 문자열을 출력하는 %s를 활용해보니 뒤에 이상한 값이 붙는 것이다.

 

%s는 문자열을 출력할 때 \0 이라는 문자가 나올때까지 출력하는 것이 된다

따라서 char[14]의 공간에 담긴 Hello, World!는 Hello, World!가 아닌 Hello, World!\0 이 되는 것이다.

 

char cStr[] = {
    'H', 'e', 'l', 'l', 'o', ',' , ' ',
    'W', 'o', 'r', 'l', 'd', '!','\0' // '\0'을 추가
};
printf("str: %s\n", str);
printf("cStr: %s\n", cStr);
printf("str Length: %d\n", sizeof(str));
printf("cStr Length: %d\n", sizeof(cStr));

※ str의 크기는 당연히 8이다 주소를 담고 있는 포인터이기 때문이다.

 

cStr 배열에 '0'의 값을 추가하고 출력을 하면 이상한 값이 붙지 않는 것과 그 크기가 14인것을 확인 할 수 있다.

 

이렇게 문자열의 값에 붙는 \0을 우리는 널 문자(null character) 라고 부른다

 

 

번외) 문자열은 이런 활용도 가능하다

char format[] = { 's','t','r',':','%','d', '\n','\0' };
printf(format, sizeof(str));

물론 이런 활용은 가능하다는 뜻이지 보통은 사용하지 않는다.

 

 

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

정적/동적 메모리 할당(Memory Allocate)  (0) 2024.08.16
문자열 함수 활용 feat)예외처리  (0) 2024.08.14
함수(Function)  (0) 2024.08.13
포인터(Pointer)  (0) 2024.08.13
배열(Array)  (0) 2024.08.12