C언어 강의 9편: 문자열 처리
· 5분 읽기
C언어 강의 9편: 문자열 처리
문자열이란?
C언어에서 문자열은 문자 배열로 표현됩니다. 문자열의 끝은 널 문자(\0)로 표시됩니다.
문자열 선언
방법 1: 문자 배열
char str[20] = "Hello";
// 또는
char str[] = "Hello"; // 크기 자동 설정 (6: 5문자 + 널 문자)
방법 2: 포인터
char *str = "Hello";
차이점:
- 배열: 수정 가능
- 포인터: 수정 불가능 (문자열 리터럴)
문자열 초기화
char str1[10] = "Hello";
char str2[] = "World";
char str3[10] = {'H', 'e', 'l', 'l', 'o', '\0'};
문자열 입력/출력
printf와 scanf 사용
char name[50];
printf("이름을 입력하세요: ");
scanf("%s", name); // 공백 전까지만 입력됨
printf("안녕하세요, %s님!\n", name);
gets와 puts 사용 (비추천)
char str[100];
gets(str); // 한 줄 전체 입력 (위험!)
puts(str); // 출력 후 줄바꿈
fgets 사용 (권장)
char str[100];
printf("문자열 입력: ");
fgets(str, sizeof(str), stdin); // 안전한 입력
printf("입력한 문자열: %s", str);
문자열 길이 구하기
직접 구현
int stringLength(char *str) {
int length = 0;
while (str[length] != '\0') {
length++;
}
return length;
}
strlen 함수 사용
#include <string.h>
char str[] = "Hello";
int len = strlen(str); // 5
문자열 복사
직접 구현
void stringCopy(char *dest, char *src) {
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
strcpy 함수 사용
#include <string.h>
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest); // Hello
strncpy 사용 (안전)
char src[] = "Hello";
char dest[20];
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0'; // 안전을 위해
문자열 연결 (Concatenation)
직접 구현
void stringConcat(char *dest, char *src) {
int destLen = strlen(dest);
int i = 0;
while (src[i] != '\0') {
dest[destLen + i] = src[i];
i++;
}
dest[destLen + i] = '\0';
}
strcat 함수 사용
#include <string.h>
char str1[20] = "Hello";
char str2[] = " World";
strcat(str1, str2);
printf("%s\n", str1); // Hello World
strncat 사용 (안전)
char str1[20] = "Hello";
char str2[] = " World";
strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);
문자열 비교
직접 구현
int stringCompare(char *str1, char *str2) {
int i = 0;
while (str1[i] != '\0' && str2[i] != '\0') {
if (str1[i] != str2[i]) {
return str1[i] - str2[i];
}
i++;
}
return str1[i] - str2[i];
}
strcmp 함수 사용
#include <string.h>
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "World";
if (strcmp(str1, str2) == 0) {
printf("같습니다.\n");
}
if (strcmp(str1, str3) < 0) {
printf("str1이 str3보다 작습니다.\n");
}
반환값:
- 0: 두 문자열이 같음
- 양수: 첫 번째 문자열이 큼
- 음수: 첫 번째 문자열이 작음
문자열 검색
strchr: 문자 검색
#include <string.h>
char str[] = "Hello World";
char *result = strchr(str, 'o');
if (result != NULL) {
printf("찾은 위치: %s\n", result); // o World
printf("인덱스: %ld\n", result - str); // 4
}
strstr: 문자열 검색
#include <string.h>
char str[] = "Hello World";
char *result = strstr(str, "World");
if (result != NULL) {
printf("찾은 위치: %s\n", result); // World
}
문자열 토큰화 (Tokenization)
strtok 함수 사용
#include <string.h>
char str[] = "Hello,World,C,Programming";
char *part = strtok(str, ",");
while (part != NULL) {
printf("%s\n", part);
part = strtok(NULL, ",");
}
출력:
Hello
World
C
Programming
문자열 변환
숫자를 문자열로
#include <stdio.h>
int num = 123;
char str[20];
sprintf(str, "%d", num);
printf("%s\n", str); // 123
문자열을 숫자로
#include <stdlib.h>
char str[] = "123";
int num = atoi(str); // 문자열을 정수로
long lnum = atol(str); // 문자열을 long으로
double dnum = atof("3.14"); // 문자열을 실수로
printf("%d\n", num); // 123
printf("%.2f\n", dnum); // 3.14
실전 예제: 문자열 뒤집기
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int len = strlen(str);
int start = 0;
int end = len - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
int main() {
char str[] = "Hello";
reverseString(str);
printf("%s\n", str); // olleH
return 0;
}
실전 예제: 단어 개수 세기
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int countWords(char *str) {
int count = 0;
int inWord = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (isspace(str[i])) {
inWord = 0;
} else if (!inWord) {
inWord = 1;
count++;
}
}
return count;
}
int main() {
char str[] = "Hello World C Programming";
printf("단어 개수: %d\n", countWords(str)); // 4
return 0;
}
실전 예제: 회문(Palindrome) 확인
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindrome(char *str) {
int len = strlen(str);
int start = 0;
int end = len - 1;
while (start < end) {
// 공백과 대소문자 무시
while (isspace(str[start])) start++;
while (isspace(str[end])) end--;
if (tolower(str[start]) != tolower(str[end])) {
return 0; // 회문이 아님
}
start++;
end--;
}
return 1; // 회문임
}
int main() {
char str[] = "A man a plan a canal Panama";
if (isPalindrome(str)) {
printf("회문입니다.\n");
} else {
printf("회문이 아닙니다.\n");
}
return 0;
}
주요 문자열 함수 정리
| 함수 | 설명 | 헤더 |
|---|---|---|
strlen() | 문자열 길이 | <string.h> |
strcpy() | 문자열 복사 | <string.h> |
strcat() | 문자열 연결 | <string.h> |
strcmp() | 문자열 비교 | <string.h> |
strchr() | 문자 검색 | <string.h> |
strstr() | 문자열 검색 | <string.h> |
strtok() | 문자열 토큰화 | <string.h> |
주의사항
- 배열 크기: 충분한 크기를 할당해야 함
- 널 문자: 문자열 끝에
\0필요 - 버퍼 오버플로우:
strcpy,strcat사용 시 주의 - 안전한 함수:
strncpy,strncat사용 권장
다음에 공부할 내용
다음 포스트에서는 구조체에 대해 공부해보겠습니다.