본문 바로가기

백준

11718)그대로 출력하기

https://www.acmicpc.net/problem/11718


문제는 입력 받은대로 출력만 하면 된다.


예를들어 입력이 아래와 같다면


Hello

World

!


위와 동일하게 출력하면 된다.


처음 이 문제를 접했을 때 gets()를 사용하면 어떨까 생각했다.


gets()는 엔터키가 입력됬을 때 입력버퍼의 \n까지 문자들을 읽어 오기 때문에


채점 프로그램이 문자열을 한 줄 씩 입력할 때 이를 저장해 뒀다가 입력이 끝날 때 출력하면 된다고 생각했다.


처음에 이 문제를 해결하기 위해 작성한 코드는 아래와 같았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#define MAX_LENGTH 100
 
int main(){
    char tempStr[MAX_LENGTH][MAX_LENGTH+1];
    int strCount = 0;
    do{
        gets(tempStr[strCount]);
        strCount++;
    }while(strCount<10);
    
    for(int i=0; i< strCount; i++){
        printf("%s\n",tempStr[i]);
    }
 
    return 0;
}
cs

이 코드는 두 가지 문제점이 있다.

첫 번째 문제는 입력이 최대 100줄까지 올 수 있다는 말은 100줄이 입력이 안될 수도 있다 의미를 품고 있다.

내가 몇 줄이 입력될지 결정해서는 안된다. 그렇다면 여러 줄의 문자열이 입력되는 상황에서

어떤 문자열이 마지막 줄로 입력됬음을 알 수 있는가?

두 번째 문제는 한 줄 씩 입력받은 즉시 출력하는 것인지 한 줄 씩 입력받은 것을 저장해뒀다가

한꺼번에 출력하는 것인지 분명하지 않다.


첫 번째 문제를 해결하기 위해 여러 레퍼런스를 조사한 결과 getchar()가 함수 호출에 실패했을 때 EOF를 반환한다는 사실을 알게 됬다.

getchar()는 입력 버퍼가 비어 있지 않다면 한 문자를 가져오고 입력 버퍼가 비어 있다면 EOF를 반환한다.

getchar()가 한 문자를 읽고 임시 변수에 저장해뒀다가 putchar()가 그 문자를 출력하는 작업을 반복하면서

getchar()가 EOF를 반환했을 때 앞의 작업을 중단하면 될 것이다. 이를 반영한 코드는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(){
    char tempChar;
    do{
        tempChar = getchar();
        if(tempChar == EOF) break;
        putchar(tempChar);
    }whle(1);
    return 0;
}
cs

이대로 제출했는데 맞았다. 한 줄씩 입력 받고 저장해뒀다가 한꺼번에 출력하는 것은 아닌 것같다.

한 가지 의문이 드는 건 ctrl+z로 의도적으로 getchar()가 EOF를 반환하는 예제 밖에 보지못해서

채점 도중에 입력 버퍼가 비어있어서 EOF가 반환됬을 지 ctrl+z를 눌러서 EOF가 반환됬을 지 궁금하다.


'백준' 카테고리의 다른 글

10799)쇠막대기  (0) 2019.01.07
2941)크로아티아 알파벳  (0) 2019.01.06
2902)KMP는 왜 KMP일까?  (0) 2019.01.06
11365)!밀비 급일  (0) 2019.01.06
11721)열 개 씩 끊어 출력하기  (0) 2019.01.05