문자열 다루기
1. 문자열의 개념
C 언어에서 문 자와 문자열은 다르게 다룹니다.
1.1. 문자의 특징
- 단일 문자는 작은따옴표(
' '
)로 표현 (예:'A'
) char
형으로 선언 (예:char a;
)- 입출력 시
%c
형식 지정자 사용
1.2. 문자열의 특징
- 문자열은 큰따옴표(
" "
)로 표현 (예:"A"
,"ABC"
) - 표시 방법
- 문자 배열 선언:
char a[10];
- 포인터 변수 선언:
char *a;
- 문자 배열 선언:
- NULL 문자(
\0
)- 문자열의 마지막은 항상 NULL(
\0
) - 문자열 배열은 "문자열+1" 크기로 선언 필요
- 출력 시 NULL 전까지 출력
- 입출력 시
%s
형식 지정자 사용
- 문자열의 마지막은 항상 NULL(
1.3. 문자 배열 초기화
-
개별 문자 초기화:
char test[10] = {'a','b','c','d','\0'};
-
문자열 리터럴 초기화:
char test[10] = "abcd"; // 마지막에 NULL 자동 포함
-
빈 문자열 초기화:
char test[10] = " ";
-
크기 명시 없이 초기화:
char test[] = "abcd";
-
포인터를 통한 초기화:
char *test = "abcd"; // 읽기 전용, 변경 불가
주의:
- NULL 전까지의 문자만 출력
- 이미 선언된 배열에 문자열 리터럴 직접 대입 불가 (선언 즉시 초기화 필요)
- 이미 선언된 배열은 각 인덱스에 문자 입력 가능
1.4. 문자 및 문자열 관련 입출력 함수 비교
구분 | 함수 | 설명 |
---|---|---|
문자 | getchar() | 문자 하나 입력 |
문자 | putchar(a) | 문자 하나 출력 |
문자 | scanf("%c", &a); | 문자 하나 입력 (주소 연산자 필요) |
문자 | printf("%c", a); | 문자 하나 출력 |
문자열 | gets_s(name, 30) | 문자열 입력 (안전) |
문자열 | gets(name) | 문자열 입력 (비권장, 버퍼 오버플로우 위험) |
문자열 | puts(name); | 문자열 출력 (자동 개행) |
문자열 | scanf("%s", name); | 문자열 입력 (공백 전까지) |
문자열 | printf("%s", name); | 문자열 출력 |
입력 함수 주의:
scanf
로 문자열 입력 시 공백/엔터 전까지만 저장gets
로 입력 시 엔터 전까지만 저장
2. 문자열 관련 라이브러리 함수
C 언어는 문자/문자열 처리를 위한 다양한 라이브러리 함수를 제공합니다.
2.1. ctype.h 라이브러리 (문자 관련)
#include <ctype.h>
함수 | 설명 | 반환 값 |
---|---|---|
isalpha(a) | a가 영문자인지 판별 | 참/거짓 |
isupper(a) | a가 대문자인지 판별 | 참/거짓 |
islower(a) | a가 소문자인지 판별 | 참/거짓 |
isspace(a) | a가 공백/개행/탭인지 판별 | 참/거짓 |
toupper(a) | a를 대문자로 변환 | 변환된 문자 |
tolower(a) | a를 소문자로 변환 | 변환된 문자 |
toascii(a) | a를 아스키 코드로 변환 | 아스키 코드 값 |
2.2. string.h 라이브러리 (문자열 관련)
#include <string.h>
함수 | 설명 |
---|---|
strlen(s) | 문자열 s의 길이 반환 (NULL 미포함) |
strcpy(s1, s2) | s2를 s1에 복사 (s1 공간 충분해야 함) |
strcat(s1, s2) | s2를 s1 끝에 붙임 (s1 공간 충분해야 함) |
strcmp(s1, s2) | 두 문자열 비교 (0:같음, 음수:앞섬, 양수:뒤섬) |
strtok(s1, deli) | s1을 deli(구분자)로 토큰 분리, 이후 NULL로 반복 호출 |
strstr(s1, s2) | s1에서 s2가 처음 나타나는 위치 포인터 반환, 없으면 NULL |
참고: Visual Studio에서
strtok
사용 시#pragma warning(disable:4996)
필요할 수 있음
2.3. 문자열 배열
-
2차원 문자 배열
char fruit[3][10] = { "apple", "bann ", "pear " };
// 각 문자열 최대 길이 명시, 고정 크기 -
문자열 포인터 배열
char *fruit[3] = { "apple", "bann ", "pear " };
// 각 포인터가 문자열 리터럴 가리킴, 길이 가변