C 언어에서 문자열(String)은 문자(char)의 배열로 표현된다. C 언어는 문자열 자료형을 따로 제공하지 않고, 문자열은 '\0' (Null 문자)로 끝나는 문자 배열로 처리된다. 이 때문에 C에서는 문자열을 다룰 때, 배열과 포인터의 개념이 함께 사용된다.
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
H | E | L | L | O | \0(₩0) |
문자 상수는 표현 가능한 문자 집합의 단일 문자를 작은따옴표(' ')로 묶어 구성한다. 즉, 'A'와 같이 ''로 표기된걸 말한다. 문자 상수는 실행 문자 집합에서 문자를 나타내는 데 사용된다.
예를 들어, 'A'에서 A는 문자값이다. 하지만 char A;
에서 A는 문자값이 아닌 문자를 저장하기 위한 변수이다.
문자열 상수는 문자열 값을 의미하며, 큰따옴표(" ")로 표현되며 "Nice meet you"와 같은 것들을 말한다.
문자열은 문자들의 배열이며, 각 문자는 char
자료형으로 저장된다. 문자열의 끝을 나타내는 특별한 문자, 널 문자(\0
)가 배열의 마지막에 추가된다. 널 문자가 문자열의 끝을 표시하므로, 문자열의 길이를 자동으로 알 수 있다.
char str[] = "Hello";
// 널 문자 포함 배열의 크기는 6 ('H', 'e', 'l', 'l', 'o', '\0')
문자열은 포인터를 사용하여 처리할 수 있으며, 문자열의 시작 주소를 가리키는 포인터를 통해 문자열을 처리할 수 있다. 이 때, 큰따옴표(" ") 안에 문자열을 넣게 되는데 이걸 문자열 리터럴이라고 한다. 즉, 포인터는 문자열을 가리키는 것이 아니라 문자열이 담겨 있는 메모리 주소를 가리킨다.
char *str = "Hello"; // 문자열 리터럴에 대한 포인터
포인터 자체에 문자열을 마치 상수처럼 읽기 전용으로 넣은 것이기에 문자열 변경이 불가능하다. 만약 문자열을 바꾸고 싶다면, 다른 문자열을 해당 포인터가 가리키게 하는 방법을 사용해야 한다.
\0
):문자열의 끝을 나타내는 특별한 문자이다. 문자열의 마지막에 반드시 추가되어야 하며, 이 문자가 없으면 배열이 그냥 문자들의 집합일 뿐, 문자열로 인식되지 않는다.
char str1[] = "Hello"; // 문자열 "Hello"를 문자 배열로 선언
char str1[6] = "Hello";
문자열에 자동으로 \0
이 추가되어, 문자열의 길이는 '문자 개수 + 1(\0
)'로 설정된다.
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
개별 문자를 지정하여 문자열을 만들 수 있으며, 마지막에 \0
을 반드시 추가해야 한다.
char *str3 = "Hello";
문자열 리터럴 "Hello"는 읽기 전용 메모리에 저장되며, str3는 그 메모리의 시작 주소를 가리키는 포인터이다.
scanf()
는 문자열을 입력받을 때 사용하는 함수로 공백을 기준으로 입력을 처리한다.
공백이 포함된 문자열을 입력받을 때는 fgets()
를 사용하는 것이 더 좋다.
char str[100];
scanf("%s", &str); // 공백이 없는 문자열 입력
printf("%s\n", str); // 문자열 출력
fgets()
& puts()
:fgets( char str, int numChars, FILE stream)
:fgets()
은 공백을 포함한 문자열을 입력받을 수 있다.
char str
: 입력받은 문자열int numChars
: 입력받은 문자열의 최대 크기('\0' 포함)FILE stream
: file로 표준 입력장치에서 데이터를 입력받겠다는 의미#include <stdio.h>
#include <string.h>
int main() {
char str[100];
fgets(str, sizeof(str), stdin); // 문자열 입력 (공백 포함)
printf("%s\n", str);
}
→ hello
→ hello
→
*한 줄이 더 출력되는 것은 fgets()로 입력을 받으면 '\n'가 알아서 문자열 끝에 들어가기 때문이다. printf()에서 개행문자를 빼면 된다.
puts()
:puts()
은 줄바꿈 문자를 자동으로 추가하여 문자열을 출력한다.
puts(str); // 문자열 출력 (자동으로 줄바꿈 추가)
C 언어에서는 문자열을 다루는 여러 표준 라이브러리 함수들이 제공되며, 이들은 <string.h>
헤더 파일에 포함되어 있다.
strlen()
: 문자열의 길이를 구함(널 문자는 포함하지 않음).size_t len = strlen(str); // 문자열의 길이를 반환
strcpy()
: 문자열을 복사.strcpy(dest, src); // src 문자열을 dest로 복사
strcat ()
: 두 문자열을 이어 붙임.strcat(dest, src); // dest 뒤에 src를 붙임
strcmp()
: 두 문자열을 비교.int result = strcmp(str1, str2); // str1과 str2를 비교
strstr()
: 문자열을 찾아 위치를 반환.strstr()
은 찾은 주소값 자체를 반환하기 때문에 찾은 문자부터 그 이후의 모든 문자열을 반환한다.
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "the real programmer";
char str2[20] = "real";
printf("찾은 문자열: %s\n", strstr(str1, str2));
return 0;
}
→ 찾은 문자열: real programmer
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
// 문자열 입력 받기
printf("Enter first string: ");
fgets(str1, sizeof(str1), stdin);
printf("Enter second string: ");
scanf("%s", &str2);
// 문자열 길이 출력
printf("Length of first string: %lu\n", strlen(str1));
printf("Length of second string: %lu\n", strlen(str2));
// 두 문자열을 이어 붙이기
strcat(str1, str2);
printf("Concatenated string: %s\n", str1);
return 0;
}
참고,
https://learn.microsoft.com/ko-kr/cpp/c-language/?view=msvc-170
https://eunjinii.tistory.com/28