C 문자열 완전 정복: 선언, 입출력, 라이브러리 함수
C에서 문자열(String)이란?
C에서 문자열은 널 문자(\0)로 끝나는 연속된 문자 시퀀스입니다. 언어에 전용 문자열 타입은 없지만, 보통 char 값의 배열로 표현됩니다. 문자열 리터럴로 초기화할 때 컴파일러가 자동으로 널 종결자를 추가합니다.
"Welcome to the world of programming!"
표준 라이브러리 헤더 <string.h>는 문자열을 효율적으로 조작하는 풍부한 함수를 제공합니다.
문자열 선언과 초기화
C는 문자열을 문자 배열로 다루므로 배열 크기를 지정해야 합니다. 크기는 저장 가능한 최대 문자 수(널 종결자 제외)를 정의합니다.
char 문자열_변수명[배열_크기];
일반적 선언:
char first_name[15]; /* 최대 14자 + \0 저장 가능 */
char last_name[15];
초기화자를 제공하면 컴파일러가 문자 수를 세고 자동으로 널 종결자를 추가합니다. 초기화자를 주면 배열 크기 생략 가능.
char first_name[15] = "ANTHONY";
char first_name[] = "NATHAN"; /* 크기 추론 */
char string3[6] = {'h','e','l','l','o','\0'}; /* 명시적 종결자 */
사용자 입력으로 문자열 읽기
입력 함수는 안전성과 동작이 다릅니다:
scanf("%s", name) – 공백 전까지 읽지만 버퍼 오버플로 취약
gets() – 한 줄 전체 읽지만 안전하지 않아 C11에서 제거됨
fgets(name, size, stdin) – size-1자까지 읽고 널 종결자 공간 확보
fgets 사용 예:
#include <stdio.h>
int main() {
char name[50];
printf("Enter your full name: ");
fgets(name, sizeof(name), stdin);
printf("Your name is %s", name);
return 0;
}
문자열 출력
문자열 표시의 고전적 방법은 printf("%s", name);입니다. 편리한 대안 두 가지:
fputs(name, stdout) – 출력 스트림에 직접 쓰기
puts(name) – 문자열 출력 후 줄바꿈 추가
puts 예제:
#include <stdio.h>
int main() {
char greeting[] = "Hello, world!";
puts(greeting);
return 0;
}
문자열 라이브러리(<string.h>)
자주 쓰이는 함수:
| 함수 | 설명 |
| strlen | 문자열 길이 반환 (널 종결자 제외) |
| strcat | 한 문자열을 다른 문자열에 덧붙임 |
| strcmp | 두 문자열을 사전순 비교 |
| strcpy | 문자열 복사 |
| strncmp | 최대 n자 비교 |
| strncpy | 최대 n자 복사 |
| strchr | 문자의 첫 출현 위치 찾기 |
| strrchr | 문자의 마지막 출현 위치 찾기 |
| strstr | 부분 문자열 찾기 |
| strncat | 최대 n자 연결 |
| strlwr | 소문자 변환 (비표준) |
| strupr | 대문자 변환 (비표준) |
| strrev | 문자열 뒤집기 (비표준) |
예시 프로그램:
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = " World!";
char result[40];
/* 비교 */
if (strcmp(str1, str2) == 0)
puts("Strings are equal");
else
puts("Strings are not equal");
/* 연결 */
strcat(str1, str2); // str1은 이제 "Hello World!"
printf("Concatenated: %s\n", str1);
/* 길이 */
printf("Length of str1: %zu\n", strlen(str1));
/* 복사 */
strcpy(result, str1);
printf("Copied string: %s\n", result);
return 0;
}
문자열을 숫자로 변환
표준 변환 함수:
atoi – int로 변환
atof – double로 변환
atol – long으로 변환
atoi 예제:
#include <stdio.h>
#include <stdlib.h>
int main() {
char number_str[20];
printf("Enter a number: ");
fgets(number_str, sizeof(number_str), stdin);
int num = atoi(number_str);
printf("You entered %d\n", num);
return 0;
}
핵심 요약
- 문자열은
char 배열에 저장되며 \0으로 끝나는 문자 시퀀스
- 사용 전 배열 크기 선언, 또는 초기화 시 컴파일러가 크기 추론
- 안전한 입력을 위해
fgets 사용; gets와 경계 검사 없는 scanf("%s") 피하기
<string.h> 활용해 견고한 문자열 연산 수행
atoi, atof, atol로 문자열 숫자 변환하여 런타임 오류 방지
- 문자열 리터럴은 읽기 전용; 수정 시 미정의 동작 유발