본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 12. Printing Tokens(문자열 토큰을 사용한 출력)

by 희품 2019. 3. 26.
반응형


학습(Study) & 목표(Objective) & 과제(Task)

단어가 포함된 문장 s가 주어지면, 각 단어를 출력하는 것이 목표이자 과제입니다.


입력 형식(Input Format)

문장 s를 첫 줄에 입력받습니다.


제약 조건(Constraints)

문장의 길이는 1보다 크거나 같고, 1000자보다는 적거나 같아야 합니다.


출력 형식(Output Format)

새로운 줄 마다 각각의 단어를 표출합니다.


입력 예제(Sample Input) - 1

This is C


주어진 문자열에는 세 단어가 있습니다. {"This", "is", "C"}

이 단어를 새로운 줄에 인쇄해야 합니다.


출력 예제(Sample Output) - 1

This

is

C


입력 예제(Sample Input) - 2

Learning C is fun


출력 예제(Sample Output) - 2

Learning

C

is

fun


입력 예제(Sample Input) - 3

How is that


출력 예제(Sample Output) - 3

How

is

that


주어진 코드

#include <stdio.h>
#include <stdlib.h>
 
int main() {
 
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    //Write your logic to print the tokens of the sentence here.
    return 0;
}


문자열이 저장될 변수를 동적으로 할당된 상태가 제공되었네요.

배열로 처음부터 재구성해도 상관은 없지만, 주어진 코드를 활용해서 답안를 작성해보겠습니다.


아래 '답안 코드'는 빈 문자(스페이스 바, ' ' )를 확인해서 줄 넘김 처리를 해주는 구현 방식이고, '제출한 코드'는 이러한 token을 받아 분류해주는 strtok 함수를 사용한 방법입니다.


malloc 함수는 메모리를 할당해주는 함수이고, realloc 함수는 메모리를 다시 할당해주는 함수입니다. 여기서는 입력받은 문자열 수 + 빈 공간을 위한 1을 동적으로 할당해 문자열 크기만큼의 메모리를 할당해주는 것을 확인할 수 있습니다.


답안 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    int len = strlen(s);
    for(int i = 0; i < len; i++) {
        if(s[i] == ' ') {
            printf("\n");
        }
        else {
            printf("%c", s[i]);
        }
    }
    free(s);
    return 0;
}


예제 답안은 문자열이 몇 글자인지 문자열 함수 strlen(s)를 통해 받고, 문자를 계속 반복해서 검사하면서 스페이스(' ')가 나오면, 줄을 넘기고, 그렇지 않으면 1글자씩 출력하는 방법을 사용하였습니다.참고로 문자열 함수 strlen() 함수는 string.h에 포함되어 있어요.



제출한 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char *tok = NULL;
    char *= NULL;
 
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    tok = strtok(s, " ");
    while (tok)
    {
        printf("%s\n", tok);
        tok = strtok(NULL" ");
    }
 
    if (s)
    {
        free(s);
        s = NULL;
    }
 
    return 0;
}


strtok 함수를 사용한 예제입니다.

strtok() 함수도 string.h에 포함되어 있어요.


char *strtok(char *strToken, const char *strDelimit);


원형은 위에처럼 생겼어요.

strToken 자리에 구분할 원본 문자열을 넣고, 구분자(strDelimit)을 넣으면, 구분자(여기서는 ' ')에 따라서 구분된 문자가 순차대로 반환됩니다.


1회 이후는 strToken 인자로 NULL을 넘겨주면, 이어서 token을 구분할 수 있어서, 문자열을 제어할 때 많이 이용하는 함수입니다. 포인터를 다루기 때문에 잘못 사용하면, 위험할 수 있는데, 이러한 부분은 나중에 기회가 되면 따로 다뤄보겠습니다. (필요하신 분이 있다면 댓글 남겨주세요)


제출한 코드에서는 토큰마다 줄넘김 처리를 하면서 출력해주고, 정리를 해주는 코드입니다.


문제에서 입력해주는 샘플에 -truncated-가 있으니, 시스템이 잘못된 것인지, 예제 프로그램의 입력이 잘못된 것인지, 거슬리는 점에서는 참 난감하군요.




반응형