학습(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
Learning C is fun
출력 예제(Sample Output) - 2
Learning
C
is
fun
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 *s = 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-가 있으니, 시스템이 잘못된 것인지, 예제 프로그램의 입력이 잘못된 것인지, 거슬리는 점에서는 참 난감하군요.
'C Programming > 연습 문제' 카테고리의 다른 글
[C언어 연습문제]강좌 14. Dynamic Array in C(도서관 책장, 책 페이지 수 쿼리, 조회 프로그램) (0) | 2019.04.03 |
---|---|
[C언어 연습문제]강좌 13. Digit Frequency(숫자 빈도수 구하기) (0) | 2019.03.29 |
[C언어 연습문제]강좌 11. Array Reversal(배열 반전, 요소 뒤집어 출력) (0) | 2019.03.22 |
[C언어 연습문제]강좌 10. 1D Arrays in C(malloc - 동적 배열 만들기) (0) | 2019.03.20 |
[C언어 연습문제]강좌 9. Printing Pattern using Loops(숫자가 둘러진 대칭 사각형 패턴 인쇄하기) (0) | 2019.03.19 |