관리 메뉴

History

쉼표로 문자열을 구분해서 줄바꿈 출력하기 - 함수 직접 구현 본문

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
반응형
Comments