문타쿠, 공부하다.
[C언어 코딩 도장] Unit 45. 문자열 자르기 본문
주어진 문자열을 자르는 방법을 알아보자.
-> 문자열 자르기는 포인터를 이용한다.
45.1 문자를 기준으로 문자열 자르기
문자열에서 문자를 자르는 방법
-> strtok 함수를 사용하면 특정 문자를 기준으로 문자열을 자를 수 있으며, string.h 헤더 파일에 선언되어 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[30] = "The Little Prince";
// " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환
// 기준 문자를 ' ' 작은 따옴표로 묶으면 ㄴㄴ
char* ptr = strtok(s1, " ");
// 자를 문자열이 나오지 않을 때까지 반복
while (ptr != NULL)
{
// 자른 문자열 출력
printf("%s\n", ptr);
// 다음 문자열을 잘라서 포인터를 반환
ptr = strtok(NULL, " ");
}
return 0;
}
strtok 함수의 동작
1단계
char *ptr = strtok(s1, " ")
- 문자열 s1에서 공백을 찾아 NULL로 채운다.
- 문자열의 첫 부분인 The를 잘라 포인터로 반환한다.
2단계
ptr = strtok(NULL, " ")
- strtok에 NULL을 넣에 앞에서 잘린 문자열 만큼 다음 문자로 이동한다.
- 그리고 다시 공백 문자를 찾아 NULL로 채운 뒤 Little을 잘라 포인터로 반환한다.
- 문자열 끝에 있는 NULL을 만날때까지 계속 반복한다.
3단계
ptr = strtok(NULL, " ")
- strtok에 NULL을 넣에 앞에서 잘린 문자열 만큼 다음 문자로 이동한다.
- 이번에는 공백이 아닌 문자열의 마지막 NULL을 만났으므로 NULL을 그대로 두고 Prince를 반환환다.
4단계
ptr = strtok(NULL, " ")
- 직전 strtok에서 공백을 만나지 못해 더는 자를 문자열이 없음 -> NULL을 반환하고 while 반복문을 벗어난다.
* strtok 함수를 사용할 때는 처음에만 자를 문자열을 넣어주고, 그 다음부터는 NULL을 넣어준다.
* strtok 함수는 문자열을 새로 생성해서 반환하는 것이 아니라, 자르는 부분을 NULL 문자로 채운 뒤 잘린 문자열의 포인터를 반환한다.
-> 이는 원본 문자열의 내용을 바꾸므로 주의해서 사용해야 한다.
45.2 문자열 포인터 자르기
문자열 포인터에 문자열 리터럴이 들어 있어서 읽기 전용인 상태라면 strtok 함수를 사용할 수 없다.
-> 동적 메모리를 할당하고, 문자열을 복사하여 자르면 가능
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char* s1 = malloc(sizeof(char) * 30);
strcpy(s1, "The Little Prince");
char* ptr = strtok(s1, " ");
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
free(s1);
return 0;
}
45.3 날짜와 시간 값 자르기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[30] = "2023-10-02T20:42:59";
// -, T, : 을 기준으로 문자열을 자름, 포인터 반환
char* ptr = strtok(s1, "-T:");
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok(NULL, "-T:");
}
return 0;
}
45.4 자른 문자열 보관하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[30] = "The Little Prince";
char* sArr[10] = { NULL, };
int i = 0;
char* ptr = strtok(s1, " ");
while (ptr != NULL)
{
sArr[i] = ptr;
i++;
ptr = strtok(NULL, " ");
}
for (int i = 0; i < 10; i++)
{
if (sArr[i] != NULL)
printf("%s\n", sArr[i]);
}
return 0;
}
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 46. 문자열과 숫자를 서로 변환하기 (0) | 2023.10.03 |
---|---|
[C언어 코딩 도장] Unit 45. 연습문제 및 심사문제 (0) | 2023.10.02 |
[C언어 코딩 도장] Unit 44. 연습문제 및 심사문제 (0) | 2023.10.02 |
[C언어 코딩 도장] Unit 44. 문자열 검색하기 (0) | 2023.10.02 |
[C언어 코딩 도장] Unit 43. 연습문제 및 심사문제 (0) | 2023.10.02 |