Introduction
가장 기초적인 문제인 입출력 문제이다. 기본 입출력도 모르고 문제를 풀고 있는 것 같아서 다시 풀어보았습니다.
전에는 별 생각없이 ~scanf를 따라쳤었는데 천천히 생각해보니 제대로 이해도 하지 않고 사용하고 있었습니다.
아래 주석 내용과 같이 scanf는 해당 포맷 형식에 맞는 값이 들어오면 해당 형식의 개수를 리턴하고, 사용자 입력 종료(콘솔에서 ctrl+z 또는 ctrl+d)가 들어오면 EOF-1을 리턴 합니다. 그리고 -1은 16진수로 표현하면 0xFFFFFFFF이고(잘 모르면 '부호비트' 검색) ~는 bitwise not 연산으로 2진수 0과 1 반대로 바꿔 줍니다. 즉, 0xFFFFFFFF -> 0x00000000(각 F는 1111이라는 2진수들이 모여있는 것이고, 각 자리수는 0, 1로 표현 가능하므로 2^4=16)이 되는 것 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <cstdio> #include <string> using namespace std; int main() { char c; // while은 true(1), false(0)로 실행 체크 // ~eof == ~-1 == ~0xFFFFFFFF == 0x00000000 == 0 while(~scanf("%c", &c)) { printf("%c", c); } } | cs |
그러므로 whlie문의 조건을 scanf("%c", &c) != -1 로 바꿔도 같은 의미가 되는 것이고
1 2 3 4 5 6 7 8 9 10 11 | #include <cstdio> #include <string> using namespace std; int main() { char c; while(scanf("%c", &c) != -1) { printf("%c", c); } } | cs |
EOF는 기본 예약어이기 때문에 역시 마찬가지의 결과를 나타냅니다.
1 2 3 4 5 6 7 8 9 10 11 | #include <cstdio> #include <string> using namespace std; int main() { char c; while(scanf("%c", &c) != EOF) { printf("%c", c); } } | cs |
또한 scanf대신 getchar printf대신 putchar를 사용해도 됩니다. 물론 getchar는 입력 받은 값을 리턴하므로 아래처럼 처리 해주어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <cstdio> #include <string> using namespace std; int main() { char c; // while은 true(1), false(0)로 실행 체크 // ~eof == ~-1 == ~0xFFFFFFFF == 0x00000000 while((c = getchar()) && c != -1) { putchar(c); } } | cs |
References
제 글이 도움이 되셨다면 간단하게 '공감', '댓글' 부탁드립니다!
'Problem Solving > BOJ' 카테고리의 다른 글
백준 1012 유기농 배추 풀이 C++ (0) | 2019.01.28 |
---|---|
백준 1918 후위 연산자 풀이 C++ (0) | 2019.01.20 |
백준 문제 풀이, PS 관련 사이트 모음 (0) | 2018.12.28 |
백준 11718번 그대로 출력하기 풀이 Python (0) | 2018.11.23 |
백준 10929번 SHA-224 풀이 Python (0) | 2018.11.23 |
댓글