2025. 2. 23. 19:13ㆍ프로그래밍 언어/C
8.3 문자열 (char 배열)
C 언어에서 문자열(String) 은 문자의 배열(char 배열) 로 표현됩니다.
문자열을 저장할 때 문자 배열의 끝에는 반드시 \0(널 문자, null character)가 포함되어야 함을 이해하는 것이 중요합니다.
문자열을 다루기 위해 gets(), puts(), fgets() 같은 입출력 함수와, strlen(), strcpy(), strcmp(), strcat() 등의 문자열 처리 함수를 사용할 수 있습니다.
1. 문자열의 개념과 \0의 역할
1.1 문자열이란?
- C 언어에서 문자열은 문자들의 배열입니다.
- 문자열의 끝을 나타내기 위해 널 문자(\0)가 자동으로 추가됨.
1.2 문자열 선언 방법
char str1[] = "Hello"; // 자동으로 '\0' 추가됨
char str2[6] = "Hello"; // 크기를 명시하면 마지막은 '\0' 포함해야 함
char str3[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 수동으로 '\0' 추가
char str4[5] = "Hello"; // 오류 (널 문자 포함 시 최소 6칸 필요)
📌 문자열 끝에는 반드시 \0(널 문자)이 있어야 함!
📌 널 문자가 없으면 문자열이 끝나는 위치를 알 수 없음.
2. 문자열 입출력 (gets(), puts(), fgets())
C에서는 문자열을 입력받고 출력하기 위해 여러 함수를 사용할 수 있습니다.
2.1 gets() 함수 (사용 지양)
- 한 줄의 문자열을 입력받을 수 있는 함수.
- 공백(space)도 포함하여 입력 가능하지만 버퍼 오버플로우 문제가 있어 사용 지양.
#include <stdio.h>
int main() {
char name[20];
printf("이름을 입력하세요: ");
gets(name); // 공백 포함 문자열 입력 가능 (비추천)
printf("입력된 이름: ");
puts(name); // 문자열 출력
return 0;
}
실행 예시
이름을 입력하세요: Alice Wonderland
입력된 이름: Alice Wonderland
📌 문제점: gets()는 입력 버퍼를 초과할 경우, 메모리 오류가 발생할 수 있음 → 사용 지양.
2.2 puts() 함수
- 문자열을 출력하는 함수.
- 자동으로 개행(\n)을 추가함.
#include <stdio.h>
int main() {
char greeting[] = "Hello, World!";
puts(greeting); // 자동 개행 포함
return 0;
}
출력 결과
Hello, World!
📌 printf("%s\n", greeting); 과 동일한 기능을 수행하지만 puts()는 개행이 자동 추가됨.
2.3 fgets() 함수 (추천)
- 버퍼 크기를 지정할 수 있어 보안상 안전한 문자열 입력 함수.
- 자동으로 \n이 포함됨.
#include <stdio.h>
int main() {
char name[20];
printf("이름을 입력하세요: ");
fgets(name, sizeof(name), stdin); // 안전한 문자열 입력
printf("입력된 이름: ");
puts(name); // 자동 개행 포함 출력
return 0;
}
실행 예시
이름을 입력하세요: Alice Wonderland
입력된 이름: Alice Wonderland
📌 fgets()는 gets()와 달리 버퍼 크기를 지정하여 오버플로우를 방지할 수 있음 → 추천!
📌 자동으로 \n이 포함되므로 개행을 제거하려면 name[strlen(name) - 1] = '\0'; 사용.
3. 문자열 관련 함수
C 언어에서는 문자열 처리를 위한 다양한 표준 라이브러리 함수를 제공하며, 이들은 <string.h> 헤더 파일을 포함하여 사용해야 합니다.
#include <string.h>
3.1 strlen() – 문자열 길이 구하기
문자열의 길이를 반환하는 함수 (\0 제외).
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("문자열 길이: %lu\n", strlen(str)); // 5 반환
return 0;
}
출력 결과
문자열 길이: 5
📌 strlen()은 \0(널 문자)을 제외한 문자열의 길이를 반환.
3.2 strcpy() – 문자열 복사
- 한 문자열을 다른 문자열로 복사.
- 복사할 대상(dest)의 크기가 충분한지 확인해야 함.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello";
char destination[10];
strcpy(destination, source); // 문자열 복사
printf("복사된 문자열: %s\n", destination);
return 0;
}
출력 결과
복사된 문자열: Hello
📌 destination 크기가 충분하지 않으면 메모리 오류 발생 가능 → strncpy()(최대 길이 지정) 사용 추천.
3.3 strcmp() – 문자열 비교
- 두 문자열이 동일한지 비교 (0이면 동일).
- 대소문자 구별 ("Hello" ≠ "hello").
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "hello";
if (strcmp(str1, str2) == 0) {
printf("두 문자열이 같습니다.\n");
} else {
printf("두 문자열이 다릅니다.\n");
}
return 0;
}
출력 결과
두 문자열이 다릅니다.
📌 비교 결과
- 0 → 두 문자열이 동일
- 양수(>0) → str1이 str2보다 큼
- 음수(<0) → str1이 str2보다 작음
3.4 strcat() – 문자열 연결 (Concatenation)
- 두 문자열을 연결하여 하나로 만듦.
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[] = " World";
strcat(str1, str2); // str1에 str2를 이어붙임
printf("연결된 문자열: %s\n", str1);
return 0;
}
출력 결과
연결된 문자열: Hello World
📌 str1의 크기가 충분하지 않으면 메모리 오류 발생 가능 → strncat()(최대 길이 지정) 사용 추천.
4. 정리
함수 | 설명 | 사용 예제 |
strlen() | 문자열 길이 반환 (\0 제외) | strlen("Hello") → 5 |
strcpy() | 문자열 복사 | strcpy(dest, src); |
strcmp() | 문자열 비교 (같으면 0) | strcmp("abc", "abc") == 0 |
strcat() | 문자열 연결 | strcat(str1, str2); |
fgets() | 안전한 문자열 입력 | fgets(str, size, stdin); |
📌 문자열은 char 배열이며, 끝에 \0이 포함됨
📌 문자열 조작 함수는 string.h를 포함해야 함
📌 gets()는 보안상 위험 → fgets() 사용 추천
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 초급 - 9장: 함수 (Function) (9.2 매개변수와 반환값) (0) | 2025.02.24 |
---|---|
C언어 초급 - 9장: 함수 (Function) (9.1 함수의 개념과 필요성) (0) | 2025.02.24 |
C언어 초급 - 8장: 배열과 문자열 (8.2 다차원 배열) (0) | 2025.02.23 |
C언어 초급 - 8장: 배열과 문자열 (8.1 배열의 개념) (0) | 2025.02.23 |
C언어 초급 - 7장: 반복문 (7.4 반복문의 제어 (break, continue)) (0) | 2025.02.23 |