C,C++/개념 실습 프로그래밍
쉼표로 문자열을 구분해서 줄바꿈 출력하기 - 함수 직접 구현
luckybee
2022. 9. 21. 17:08
728x90
반응형
아래와 같이 쉼표로 구분된 문자열이 있습니다.
"Hello~! ,My name is minki kim~ ,How are you today~? ,:)"
이 문자열을 쉼표 구분해서 아래와 같은 이미지처럼 나오게 하려면 어떻게 해야 할까?
단 이번 게시물에서는 직접 사용자 함수를 만들어서 ', ' 단위로 구분할 것이다. 그리고 ', '를 기점으로 줄 바꿈 문자와 strtok 함수를 사용하지 않을 것이다.
우선
우선 함수의 매개변수를 3가지 만들었다.
첫 번째 매개 변수는 전체 문자열을 대입할 포인터 변수이다.
두 번째 매개 변수는 구분자를 받을 문자 변수다.
마지막 매개 변수는 분리한 문자열 추출하기 위한 매개변수다.
#include<stdio.h>
#pragma warning(disable:4996)
// ap_string 문자열에서 a_delimiter 또는 NULL 문자가 나올때까지 ap_temp_string 메모리에
// 문자열을 복사한다. 예를들어, ap_string "abc,def"라고 들어있고 a_delimiter에
// ','가 전달되면 ap_temp_string "abc"문자열이 저장된다.
// 그리고 이 함수는 자신이 탐색을 완료한 위치의 다음 주소를 반환한다.
// 즉 "abc,def" 문자열의 ','문자 다음에 위치한 주소(d의 주소)를 반환한다.
char *GetNextString(char *ap_string, char a_delimiter, char *ap_temp_string){
// NULL 문자 또는 a_delimiter 문자가 나올때까지 반복하면서
// ap_string이 가리키는 문자를 ap_temp_string이 가리키는 메모리에 복사한다.
while (*ap_string && *ap_string != a_delimiter) *ap_temp_string++ = *ap_string++;
*ap_temp_string = 0; //분리된 문자열 마지막 위치에는 null문자를 추가한다.
// ap_string 포인터가 가리키는 위치는 문자열 분리에 사용된 a_delimiter 문자의
// 위치이거나 NULL 문자의 위치이다. 만약 a_delimiter 문자 위치를 가리킨다면
// 다음 문자는 ',' 다음 위치에서 진행될 것이기 때문에 ++해준다.
if (*ap_string == a_delimiter) ap_string++;
return ap_string; // 탐색을 완료한 위치의 주소를 반환한다.
}
int main()
{
char string[] = "Hello~! ,My name is minki kim~ ,How are you today~? ,:)";
char *p_pos = str; // 문자열의 시작 주소를 대입
char tmep_string[32]; // 각 문장을 저장할 변수
// NULL 문자가 나올때까지 반복한다.
for (int i = 1; *p_pos; i++) {
// p_pos위치에서 시작하여 ',' 문자가 나올때까지
// tmep_string 변수에 문자열을 복사한다.
p_pos = GetNextString(p_pos, ',', tmep_string);
// 분리한 문자열을 출력한다.
printf("%d - %s\n", i, tmep_string);
}
return 0;
}
위와 같이 구성하면 string.h와 같은 헤더파일을 사용하지 않고 문자열 처리를 할 수 있기 때문에 후에 프로그래밍을 할 때 좀 더 성능이 좋은 프로그램을 만들 수 있다.
728x90
반응형