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 |