shoomj   4년 전

위 두가지 코드의 다른점은 while문에 있는 scanf앞에 ~연산자가 붙냐 마냐의 차이 입니다. 

결과를 실행했을 때 모습은 둘다 완전 같은거 같은데 ~연산자가 붙지 않은 경우에는 출력 초과가 나옵니다.
~가 붙었을 때와 붙지 않았을 때의 차이를 잘 모르겠습니다. 
설명좀 부탁드리겠습니다.

gallopsys   4년 전

"~연산자"는 C언어에서 비트를 반전시키는 연산자입니다. 예를 들어 4비트 정수 15(0b1111)가 있다면, 이를 비트 반전 시키면 0(0b0000)이 되겠죠.
즉, 1의 보수 연산을 도와주는 연산자가 바로 "~"입니다.

그리고 C/C++의 scanf는 stdin stream에서 입력이 더 이상 들어오지 않으면 int형으로 -1을 반환합니다. -1은 4바이트에서 비트로 표현하면 0xFFFFFFFF인데, 이를 비트 반전 시키면 0x00000000, 다시 말해 ~scanf("%10s", s)에서 입력이 더 이상 들어오지 않을 경우 0이 됩니다.

C/C++에서는 0을 제외한 모든 값은 True 처리 되므로, 0은 곧 False가 됨을 의미하며 이는 입력이 중지되는 경우 반복문에서 탈출한다는 것을 의미합니다.

결론적으로 ~scanf("%10s", s)는 scanf("%10s", s) != -1이랑 같다는 걸 의미합니다.

shoomj   4년 전

오...... 감사합니다. 

매우 깔끔한 설명 이십니다 !!!^^

shoomj   4년 전

아! 한가지 더 질문 드리고 싶은데


~ 연산자를 사용하던지 말던지 제가 위에 적은 두가지 소스는 while에서 계속 돌고 있더라구요...

그래서 visual studio상에서 프로그램을 돌려보면 둘다 같은 동작모습을 보여주는거 같은데,

"~scanf("%10s", s)에서 입력이 더 이상 들어오지 않을 경우 0이 됩니다" 라고 말씀 해주셨는데,

while을 계속 돌고 있는걸로 봐서는 처음에 입력한 문자열을 10개씩 끊어서 출력한 다음에 

다시 scanf에서 대기하고 있는거 같습니다. 


gallopsys   4년 전

모든 콘솔/터미널 장비에서는 사용자가 표준 입력으로 입력을 할 때, "사용자가 입력을 계속할 것인지 사용자가 입력을 그만둘 것인지" 알 수 있는 방법이 없습니다. 그냥 입출력 인터럽트에 묶여서 사용자가 입력을 계속하길 기다리고 있을 뿐이죠.


그래서 입력이 끝났음을 나타내는 EOF Signal이 필요합니다. 사용자가 직접 EOF를 넣어주는 방법인데, 윈도우에서는 Ctrl + Z를 누르면 되고, 리눅스에서는 Ctrl + D를 누르면 EOF를 내보내게 됩니다.

단, 사용하실 땐 반드시 개행을 하신 상태에서 넣어주셔야 정상 동작합니다. 물론 채점 서버에선 저런 방법으로 채점하진 않지만, 사용자가 표준 입출력에서 확인할 수 있는 방법은 저 방법이 있습니다.

뭐.. 저 방법 말고도 파일 입/출력을 이용하는 방법이나, 명령행 인수를 이용하는 방법도 있습니다.

댓글을 작성하려면 로그인해야 합니다.