본문 바로가기
Problem Solving/BOJ

백준 11718 그대로 출력하기 C++

by chuckolet 2019. 2. 2.

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

C언어 표준 입출력 정리

비트 단위 연산자


제 글이 도움이 되셨다면 간단하게 '공감', '댓글' 부탁드립니다!



댓글