[C 언어] 문자열 처리 함수
💡 문자열을 함수에 전달할 때에는 포인터를 사용하는 것이 좋다!!
- 함수에 문자열을 직접 전달하는 경우에는 문자열의 크기를 알아야 한다.
- 그러나 포인터를 사용하면 문자열의 시작 주소만으로도 함수에서 해당 문자열을 참조할 수 있다.
- 이 방식을 사용하면 메모리의 효율성이 향상되며, 문자열을 복사하는 오버헤드가 없어진다.
stdio.h
표준 입출력 관련 함수들이 선언된 헤더 파일 (Standard Input/Output Header)
✔ puts()
int puts ( const char *str );
- 문자열을 출력 하는 함수
puts()
함수는 문자열을 출력하고 자동으로 줄 바꿈을 추가
⭐️ Example
#include <stdio.h>
int main() {
const char *message = "Hello, World!";
puts(message);
return 0;
}
>> Hello, World!
✔ gets()
& fgets()
char *gets ( char *str );
char *fgets ( char *str, int size, FILE *stream );
- 사용자로부터 문자열을 입력 받는 함수
gets()
함수는 입력을 받아 문자열로 저장하고, 입력이 끝나면 엔터 키 전까지의 문자열을 반환- 하지만,
gets()
함수는 버퍼 오버플로우와 관련된 보안 취약점을 가지고 있기에fgets()
함수를 권장 fgets()
함수는 두 번째 매개변수로 읽을 최대 문자 수를 지정할 수 있어, 입력 받을 문자열의 길이를 제한할 수 있음
⭐️ Example
#include <stdio.h>
int main() {
char input[100];
printf("문자열을 입력하세요: ");
fgets(input, sizeof(input), stdin);
printf("입력한 문자열: %s\n", input);
return 0;
}
string.h
문자열 처리 관련 함수들이 선언된 헤더 파일 (String Handling Header)
✔ strlen()
size_t strlen ( const char *str );
인수로 전달된 문자열의 길이를 반환하는 함수
⭐️ Example
#include <string.h>
char str[] = "Welcome";
printf("이 문자열의 길이는 %d입니다.\n", strlen(str));
>> 이 문자열의 길이는 7입니다.
✔ strcat()
& strncat()
char *strcat ( char *destination, const char *source );
char *strncat ( char *destination, char *source, size_t num );
- 하나의 문자열에 다른 문자열을 연결해주는 함수
strcat()
: 첫 번째 인수로 전달된 문자열이 기준 문자열이 되고, 두 번째 인수로 전달된 추가하고자 하는 문자열의 복사본이 기준 문자열 뒤에 추가됨strncat()
:strcat()
함수와 하는 일은 같지만, 세 번째 인수로 추가할 문자열의 최대 길이 지정 가능- 배열 오버플로우 현상을 방지하기 위해
strcat()
함수 대신strncat()
함수를 사용하는 것이 좋다.
⭐️ Example
#include <string.h>
char str01[20] = "C language is "; // 널 문자를 포함하여 15문자
char str02[] = "Cool! and funny!";
//strcat(str01, str02); // 이 부분의 주석 처리를 삭제한 후 실행시키면 배열 오버플로우가 발생함
strncat(str01, str02, 5); // 이렇게 최대 허용치를 설정해 놓으면 배열 오버플로우에 대해서는 안전해짐
puts(str01); // 문자열 출력 함수
>> C language is Cool!
✔ strcpy()
& strncpy()
char *strcpy ( char *destination, const char *source );
char *strncpy ( char *destination, const char *source, size_t num );
- 문자열을 복사하는 함수
strcpy()
: 첫 번째 인수로 전달된 배열에, 두 번째 인수로 전달된 문자열을 복사strncpy()
:strcpy()
함수와 하는 일은 같지만, 세 번째 인수로 복사할 문자열의 최대 길이 지정 가능- 배열 오버플로우 현상을 방지하기 위해
strcpy()
함수 대신strncpy()
함수를 사용하는 것이 좋다.
⭐️ Example
#include <string.h>
char str01[20] = "C is Cool!";
char str02[11];
// str02 배열의 크기만큼만 복사를 진행하며, 마지막 한 문자는 널 문자를 위한 것임
strncpy(str02, str01, sizeof(str02)-1);
str02[sizeof(str02)-1] = '\0'; // 이 부분을 주석 처리하면, 맨 마지막에 널 문자를 삽입하지 않음
puts(str02);
>> C is Cool!
✔ strcmp()
& strncmp()
int strcmp ( const char *str1, const char *str2 );
int strncmp ( const char *str1, const char *str2, size_t num );
- 문자열의 내용을 비교하는 함수
strcmp()
: 두 개의 문자열 포인터를 전달받아, 해당 포인터가 가리키는 문자열의 내용을 서로 비교strncmp()
:strcmp()
함수와 하는 일은 같지만, 세 번째 인수로 비교할 문자의 개수 지정 가능- 첫 번째 인수로 전달된 문자열이 더 큰 경우는 양수, 두 번째 인수로 전달된 문자열이 더 큰 경우는 음수, 두 문자열의 내용이 완전히 같은 경우 0을 반환
⭐️ Example
#include <stdio.h>
#include <string.h>
int main() {
// 두 문자열 비교
const char *str1 = "apple";
const char *str2 = "apple pie";
// strcmp 함수 사용
int result1 = strcmp(str1, str2);
printf("strcmp result: %d\n", result1);
// strncmp 함수 사용 (전체 문자열 비교)
int result2 = strncmp(str1, str2, strlen(str1));
printf("strncmp result: %d\n", result2);
return 0;
}
>>
strcmp result: -4
strncmp result: 0
✔ strstr()
char *strstr ( const char *str1, const char *str2 );
- 문자열에서 부분 문자열을 검색하는 함수
- 첫 번째 인수로 검색 대상이 되는 문자열, 두 번째 인수로 찾고자 하는 부분 문자열을 입력
- 일치하는 문자열을 찾으면 해당 위치의 포인터(
char*
타입)를 반환, 찾지 못하면null pointer
를 반환
⭐️ Example
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "Hello, World!";
const char *str2 = "World";
char *result = strstr(str1, str2);
if (result != NULL) {
printf("부분 문자열이 발견되었습니다: %s\n", result);
} else {
printf("부분 문자열을 찾을 수 없습니다.\n");
}
return 0;
}
>> 부분 문자열이 발견되었습니다: World!
✔ strchr()
& strrchr()
char *strchr ( const char *str, int character );
char *strrchr ( const char *str, int character );
- 문자열에서 특정 문자를 검색하는 함수
- 첫 번째 인수로 검색 대상이 되는 문자열, 두 번째 인수로 찾고자 하는 문자를 입력
strchr()
함수는 문자열에서 검색한 문자가 처음으로 등장하는 곳의 포인터를 반환strrchr()
함수는 문자열에서 검색한 문자가 마지막으로 등장하는 곳의 포인터를 반환
⭐️ Example
#include <stdio.h>
#include <string.h>
int main() {
const char *str = "Hello, World!";
char search_char = 'W';
char *result = strchr(str, search_char);
if (result != NULL) {
printf("문자가 발견되었습니다: %s\n", result);
} else {
printf("문자를 찾을 수 없습니다.\n");
}
return 0;
}
>> 문자가 발견되었습니다: World!
ctype.h
문자(character)와 관련된 함수들을 선언하는 헤더 파일 (Character Type Header)
✔ toupper()
& tolower()
int toupper ( int c );
int tolower ( int c );
인수로 전달된 문자열의 영문자를 모두 대문자나 소문자로 변환시켜주는 함수
⭐️ Example
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
int length = strlen(str);
// 문자열 전체를 대문자로 변환
for (int i = 0; i < length; i++) {
str[i] = toupper(str[i]);
}
printf("Uppercase String: %s\n", str);
return 0;
}
>> Uppercase String: HELLO, WORLD!