C 언어에서 문자열을 배우며 헷갈렸던 내용과 문자열을 다루는 함수를 정리해보았다.
C 언어에서 문자열은 char
배열로 저장되며, 문자열의 끝을 나타내는 NULL 문자('\0')
가 포함된다.
#include <stdio.h>
int main() {
char str[] = "Hello"; // {'H', 'e', 'l', 'l', 'o', '\0'}
printf("%s\n", str); // Hello 출력
return 0;
}
printf("%s", str);
같은 함수는 NULL 문자('\0')
를 만날 때까지 문자를 출력한다.
즉, char
배열에서 NULL 문자
가 없다면, 예상치 못한 메모리 영역까지 읽어버릴 수 있어 조심해야 한다.
char *
vs char[]
char[]
배열을 사용한 문자열 선언 방식이다.
char str1[] = "Hello"; // 스택 메모리에 저장됨
str1[0] = 'h'; // 변경 가능
char *
포인터를 사용한 문자열 선언 방식이다.
char *str2 = "Hello"; // 문자열 리터럴은 읽기 전용 메모리에 저장됨
// str2[0] = 'h'; // 오류 발생 가능
malloc
)#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str3 = (char *)malloc(6 * sizeof(char)); // 6바이트 동적 할당
strcpy(str3, "Hello"); // 문자열 복사
printf("%s\n", str3); // Hello 출력
free(str3); // 메모리 해제 필수
return 0;
}
이렇게 동적 할당을 하면 힙(Heap) 메모리를 사용하게 되며, 사용 후 반드시 free()
로 해제해야 한다.
C 언어에서는 문자열을 다룰 수 있는 다양한 함수를 제공한다.
이 함수들을 사용하려면 <string.h> 헤더파일을 include 해야한다.
strlen()
- 문자열 길이 반환#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
printf("문자열 길이: %lu\n", strlen(str));
return 0;
}
strcpy()
- 문자열 복사#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello";
char dest[10];
strcpy(dest, src);
printf("복사된 문자열: %s\n", dest);
return 0;
}
strcmp()
- 문자열 비교#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0) {
printf("%s이(가) %s보다 앞에 있음\n", str1, str2);
} else if (result > 0) {
printf("%s이(가) %s보다 뒤에 있음\n", str1, str2);
} else {
printf("두 문자열이 같음\n");
}
return 0;
}
strcmp
가 반환하는 값0
: 두 문자열이 같음strcmp()
직접 구현하기#include <stdio.h>
int my_strcmp(const char *s1, const char *s2) {
while (*s1 && (*s1 == *s2)) {
s1++;
s2++;
}
return *(unsigned char *)s1 - *(unsigned char *)s2;
}
int main() {
printf("비교 결과: %d\n", my_strcmp("apple", "banana"));
return 0;
}
‘a’ = 97
‘A’ = 65
대문자가 섞이는 순간 소문자보다 무조건 사전 기준으로 앞에 나온다고 판단한다.
주로 같은값인지 비교할때 쓰는 함수이다. 그 이상으로 사용할 시에 대소문자에 따른 결과값 차이를 고려해야한다.
strcat()
- 문자열 이어 붙이기#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[] = " World";
strcat(str1, str2);
printf("연결된 문자열: %s\n", str1);
return 0;
}
strchr()
- 특정 문자 찾기#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *pos = strchr(str, 'W');
if (pos) {
printf("W의 위치: %ld\n", pos - str);
} else {
printf("문자 없음\n");
}
return 0;
}
strstr()
- 특정 문자열 찾기#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *pos = strstr(str, "World");
if (pos) {
printf("World의 위치: %ld\n", pos - str);
} else {
printf("문자열 없음\n");
}
return 0;
}
C에서는 문자열이라는 자료형이 없기에 char형 배열을 이용해야하기에 메모리나 '\0'이 나올때까지 실행한다는 점 등 개발자가 알고 신경써야하는 부분이 더 많은것 같다.
그래도 이렇게 C를 배우고나니까 나중에 C++이나 Java Python 등 다른 언어를 더 쉽게 이해할것같다.