문자열과 문자 배열
우리가 여지껏 사용한 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형의 데이터들의 배열이다.
string s = "HI!";
와 같이 문자열 s
가 정의되어 있다고 생각해보자.
s
는 문자의 배열이기 때문에 메모리상에 아래 그림과 같이 저장되고 인덱스를 통해 각 문자에 접근할 수 있다.
여기서 가장 끝의 \0
은 문자열의 끝을 나타내는 널 종단 문자$_{null \space terminator}$이다.
단순히 모든 비트가 0인 1바이트를 의미한다.
널 종단 문자는 문자열의 끝을 명확히 나타내 문자열을 처리하는 함수들이 어디까지 읽어야 할지를 알 수 있게 해준다.
문자열 배열의 사용
다음은 여러 문자열이 동시에 선언된 경우를 살펴보자.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string names[4];
names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRIAN";
names[3] = "DAVID";
printf("%s\n", names[0]);
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
}
names
라는 문자열 형식의 배열에 네 개의 이름이 저장되어 있다.
첫 번째 printf
에서는 names
의 첫 번째 인덱스의 값, 즉 "EMMA"를 출력한다.
두 번째 printf
에서는 형식 지정자가 %s
가 아닌 %c
로 설정되어 있음을 확인할 수 있다. 따라서 출력하는 것은 문자열이 아닌 문자이다.
여기서 각 이름의 문자들을 출력하고자 한다. 예를 들어 names[0][1]
은 names
의 첫 번째 값인 "EMMA"에서 두 번째 문자 'M'을 의미한다.
아래 그림에서 names
가 실제 메모리상에 저장된 예시와 해당하는 인덱스를 확인할 수 있다.
위 예제에서는 names
배열을 통해 각 문자열과 문자에 접근하는 방법을 보여준다.
names[0]
은 "EMMA" 문자열 전체를 가리키고 names[0][1]
은 그 문자열의 두 번째 문자 'M'을 가리킨다.
문자열의 동적 할당
동적 할당을 통해 문자열을 처리하면 더 유연하게 사용할 수 있다.
예를 들어 사용자가 입력한 문자열을 저장하고 처리하는 프로그램을 작성해보자.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s = get_string("Input a string: ");
if (s == NULL)
{
return 1;
}
printf("You entered: %s\\n", s);
printf("First character: %c\\n", s[0]);
printf("String length: %lu\\n", strlen(s));
}
입력한 문자열을 받아서 출력하고 첫 번째 문자와 문자열의 길이를 출력한다.
get_string
함수로 문자열을 동적으로 할당해 입력을 받은 다음 strlen
함수로 문자열의 길이를 계산한다.
문자열의 복사와 비교
문자열을 처리할 때 자주 사용되는 작업은 문자열의 복사와 비교이다.
C에서는 strcpy
와 strcmp
함수를 사용하여 문자열을 복사하고 비교할 수 있다.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s1 = "HELLO";
char s2[6];
// 문자열 복사
strcpy(s2, s1);
printf("Copied string: %s\n", s2);
// 문자열 비교
if (strcmp(s1, s2) == 0)
{
printf("Strings are equal.\n");
}
else
{
printf("Strings are not equal.\n");
}
}
s1
문자열을 s2
에 복사하고 두 문자열을 비교한다.
strcpy
함수는 s1
의 내용을 s2
에 복사하고 strcmp
함수는 두 문자열이 같은지 비교해 결과를 반환한다.
문자열을 배열로 다루는 방법과 다양한 문자열 함수들을 통해 문자열을 효과적으로 처리할 수 있다.
C 프로그래밍에서 문자열을 다루는 방법을 잘 이해하고 활용하면 더 복잡한 문자열 처리를 수행할 수 있다.
References
'CSE > CS 기초' 카테고리의 다른 글
[CS50] 배열 - 명령행 인자 (1) | 2024.06.13 |
---|---|
[CS50] 배열 - 문자열의 활용 (1) | 2024.06.13 |
[CS50] 배열 - 배열(2) (1) | 2024.06.13 |
[CS50] 배열 - 배열(1) (0) | 2024.06.13 |
[CS50] 배열 - 디버깅 (0) | 2024.06.13 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!