1. 문자열
C언어에서 문자열은 문자의 배열로 표현되며, 종료 문자인 NULL 문자(\0)로 끝나야 한다.
2. 문자열 선언
문자열을 선언하는 가장 기본적인 방법은 배열을 사용하는 것이다.
배열의 크기는 문자열의 길이보다 하나 더 커야 한다.
char str[6] = ["hello"];
3. 문자열 선언과 초기화
3.1 문자열 선언
3.1.1 문자 배열을 사용한 선언
5개의 문자와 마지막에 추가되는 NULL 문자를 저장할 수 있는 배열이다.
char str[6] = "hello";
3.1.2 포인터를 사용한 선언
포인터를 사용하여 문자열을 선언하면 일반적으로 수정할 수 없는 메모리에 위치함으로 변경이 불가능하다.
char *str = "hello";
3.2 문자열 초기화
3.2.1 초기 선언 시 문자열 상수를 사용하여 초기화하기
이 방법은 컴파일러가 배열의 크기를 자동으로 결정한다.
char str[] = "Hello";
3.2.2 문자 배열 하나씩 할당하기
각 문자를 배열의 특정 위치에 직접 한개 씩 할당해야 한다.
char str[6];
str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '\\0'; // 널 문자를 명시적으로 추가
3.2.3 문자열 함수를 사용하여 초기화
C 표준 라이브러리는 문자열을 다루는 여러 함수를 제공한다.
#include <string.h>
char str[6];
strcpy(str, "Hello");
4. 문자열 다루기
C 표준 라이브러리(string.h) 에서는 문자열을 처리하기 위해 다양한 함수를 제공한다.
4.1 strlen
문자열의 길이를 반환한다.
문자열의 끝을 나타내는 NULL 문자를 제외한 문자열 길이 계산
// 기본 구조
strlen(const char *str);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
size_t len = strlen(str);
printf("The length of the string \\"%s\\" is %zu.\\n", str, len); // len 값은 13
return 0;
}
4.2 strcpy
4.2.1 매개변수
- dest: src에서 복사된 문자열이 저장
- src: 복사될 문자열
char *strcpy(char *dest, const char *src);
// dest: 복사한 값을 넣을 문자열
// src: 복사할 문자열
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[20]; // 충분한 크기로 선언해야 합니다.
strcpy(dest, src);
printf("dest: %s\\n", dest);
return 0;
}
4.3 strncpy
한 문자열을 다른 문자열로 n만큼 복사 ( strcpy보다 보안상으로 더 안전하다. —> buffer overflow 방지 )
4.3.1 매개변수
- dest: src에서 복사된 문자열이 저장
- src: 복사될 문자열
- n은 src에서 dest로 복사할 최대 문자 수이다.
char *strncpy(char *dest, const char *src, size_t n);
4.4 strcat
한 문자열의 끝에 다른 문자열을 연결한다.
4.4.1 매개변수
- dest : 대상 문자열을 가리키는 포인터입니다. src 문자열이 추가될 위치
- src : dest 문자열에 추가될 원본 문자열을 가리키는 포인터
4.4.2 반환 값
dset 문자열의 포인터이다.
// 기본 구조
char *strcat(char *dest, const char *src);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("%s\\n", dest); // "Hello, World!" 출력
return 0;
}
4.5 strcmp
두 문자열을 비교한다.
4.5.1 매개변수
- s1, s2: 비교할 두 문자열을 가리키는 포인터
4.5.2 반환 값
- 함수는 s1 문자열과 s2 문자열을 비교하여, 두 문자열이 동일한 경우 0을 반환
- s1이 s2보다 사전적으로 앞서는 경우(즉, s1이 더 작은 경우), 0보다 작은 값이 반환
- s1이 s2보다 사전적으로 뒤에 오는 경우(즉, s1이 더 큰 경우), 0보다 큰 값이 반환
// 기본 구조
int strcmp(const char *s1, const char *s2);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0) {
printf("\\"%s\\" is less than \\"%s\\"\\n", str1, str2);
} else if (result > 0) {
printf("\\"%s\\" is greater than \\"%s\\"\\n", str1, str2);
} else {
printf("\\"%s\\" and \\"%s\\" are equal\\n", str1, str2);
}
return 0;
}
4.6 strncmp
두 문자를 비교하지만 최대 지정된 개수의 문자까지만 비교 가능
4.6.1 매개변수
- s1, s2: 비교할 두 문자열을 가리키는 포인터
- n: 비교할 최대 문자 수
4.6.2 반환 값
- 함수는 s1 문자열과 s2 문자열을 비교하여, 두 문자열이 동일한 경우 0을 반환
- s1이 s2보다 사전적으로 앞서는 경우(즉, s1이 더 작은 경우), 0보다 작은 값이 반환
- s1이 s2보다 사전적으로 뒤에 오는 경우(즉, s1이 더 큰 경우), 0보다 큰 값이 반환
// 기본 구조
int strncmp(const char *s1, const char *s2, size_t n);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello World";
char str2[] = "Hello Korea";
int result = strncmp(str1, str2, 5); // 처음 5개 문자만 비교
if (result == 0) {
printf("처음 5개 문자가 같습니다.\\n");
} else {
printf("처음 5개 문자가 다릅니다.\\n");
}
return 0;
}
4.7 strchr
문자열에서 주어진 문자를 찾고, 그 위치를 가리키는 포인터 반환
4.7.1 매개변수
- str: 검색 대상이 되는 문자열을 가리키는 포인터
- c: 찾고자 하는 문자입니다. int 타입이지만, 실제로는 문자를 나타냅니다. 함수 내부에서는 이 값을 char로 변환하여 처리
4.7.2 반환 값
- 함수는 문자열 str 내에서 문자 c가 처음으로 등장하는 위치를 가리키는 포인터를 반환
- 만약 str 내에 c가 존재하지 않는 경우, NULL 포인터를 반환
// 기본 구조
char *strchr(const char *str, int c);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *p;
p = strchr(str, 'W');
if (p != NULL) {
printf("찾은 문자: %c\\n", *p);
printf("찾은 위치부터의 문자열: %s\\n", p);
} else {
printf("문자를 찾을 수 없습니다.\\n");
}
return 0;
}
4.8 strstr
하나의 문자열 내에서 다른 문자열을 찾고, 첫 번째 발견된 위치를 가리키는 포인터 반환
4.8.1 매개변수
- haystack: 검색 대상이 되는 문자열을 가리키는 포인터
- needle: haystack 문자열 내에서 찾고자 하는 부분 문자열을 가리키는 포인터
4.8.2 반환 값
- 함수는 haystack 내에서 needle 문자열이 처음으로 나타나는 위치를 가리키는 포인터를 반환
- 만약 needle 문자열이 haystack 내에 존재하지 않으면, 함수는 NULL 포인터를 반환
// 기본 구조
char *strstr(const char *haystack, const char *needle);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *sub;
sub = strstr(str, "World");
if (sub != NULL) {
printf("Found substring: %s\\n", sub);
} else {
printf("Substring not found.\\n");
}
return 0;
}
4.9 strtok
문자열을 특정한 구분자를 기준으로 토큰(token)으로 분리하는데 사용된다.
4.9.1 매개변수
- str: 분리하고자 하는 원본 문자열을 가리키는 포인터 첫 번째 호출에서는 실제로 분리할 문자열의 주소를 전달하고, 이후 호출에서는 문자열을 추가적으로 분리하고자 할 때는 NULL을 전달
- delim: 구분자 문자들을 나열한 문자열을 가리키는 포인터 이 문자열에 포함된 각각의 문자는 구분자로 작용
4.9.2 반환 값
- 함수는 분리된 토큰을 가리키는 포인터를 반환
- 더 이상 토큰을 찾을 수 없을 때는 NULL을 반환
// 기본 구조
char *strtok(char *str, const char *delim);
// 예시
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a sample string";
char *token;
char *rest = str;
// 첫 번째 호출에서는 문자열의 주소를 전달
token = strtok(rest, " ");
while (token != NULL) {
printf("%s\\n", token);
// 이후 호출에서는 NULL을 전달하여 문자열의 나머지 부분에서 계속 분리
token = strtok(NULL, " ");
}
return 0;
}