luckyquit   4년 전

문제는 저만의 방식으로 정답을 받았습니다! 


평소에 다른 사람의 코드를 보며 개선할 것이 있나 공부를 합니다. 이 문제또한 예외는 없었죠.

5번 라인 while문 조건에 있는 명령문을 보면 저 결과값이 0이 아니면 카운트가 올라가게 되있더군요. 공백문자는 아스키코드값 32였나? 아무튼 그렇고 널문자가 0이기 때문에 저게 돌아갈까 생각했습니다. 

정상실행됩니다............

아마도 scanf는 공백 탭 엔터키로 구분을 하기때문에 이 세가지는 똑같이 처리되나보다라고 추측을 했구요

뭐 여기까진 이해가 됩니다.

근데 저 %s에 대한 scanf는 인자가 없습니다.... %*s가 무엇을 의미하는지 긴가민가합니다. (설마 입력받은 값을 저장할때만 &변수 이고, 굳이 인자를 전달안해도 된다 이런건 아니겠죠? 평소에 저렇게 쓰는 걸 본적이 없어가지고,,,)

scanf %s의 인자는 char* 이니까 거기에 *를 하나 더 붙이면 문자열의 각 글자를 표현하는 거겠죠. 그럼 여기서 입력받은 문자는 어디에 저장되는 거죠? 임시버퍼...?인가요?

scanf("blabla");의 반환값이 있는 건 알지만 아마도 입력받은 글자가 나오진 않을 거 같습니다. 아마도 글자가 입력되면 0, 탭 스페이스바 엔터키가 들어오면 1을 출력해준다고 추측이 됩니다. 

그리고 보통 ~보다는 !을 쓰지 않나요? 뭐 0과 1이면 결과에는 지장이 없는 건 맞지만,,

그리고 뭔가 개인적인 생각인데, 저건 숏코딩용이지 안정적인 코드는 아니라고 생각이 드네요,, 근거없이 그냥 촉만 그렇습니다.

여기까지가 제 추측입니다. 제 부족한 이해를 매꿔주실 분 찾습니다.

항상 답변 달아주셔서 감사합니다.

djm03178   4년 전

코드를 아무리 부분을 올린다고 해도 그 부분은 제대로 올려주셔야 합니다. 그냥 %*s가 아니라 "%*s"겠죠. 애초에 길지도 않은 코드를 굳이 이렇게 자르고 편집해서 올리시는 이유를 모르겠습니다.

scanf의 서식 문자에서 *은 그 부분에서 입력받은 값을 어디에도 저장하지 않겠다는 의미입니다. 그래서 화이트스페이스로 구분되는 문자열 하나를 입력받기는 하는데, 그걸 어디에도 저장하지 않고 그대로 버리게 됩니다.

그리고 scanf가 반환하는 값은 처리한 서식 문자의 개수를 의미합니다. 단, 파일의 끝 (EOF)가 나타났을 때에는 EOF를 반환하는데, 이 값이 (통상적으로) -1이기 때문에 ~(-가 아니라)를 붙여 비트를 반전시키면 0이 되므로 EOF가 나타났을 때 루프를 탈출한다는 의미가 됩니다.

luckyquit   4년 전

djm03178 감사합니다.

코드를 전부 올리지 않은 이유는 백준 사이트에서 문제를 맞추지 못한 사람은 코드를 볼 수 없기도 하고, 제가 작성한 코드가 아니기 때문에 일부분만 올렸습니다. 그게 맞는거 같다는 생각을 했네요. 아 그리고 베끼는 과정에서 ""를 빼먹었나보네요.. 


제가 이해한걸 말씀드리자면, 예를들어 "ab-aa\0" (-는 공백을 의미)라는 것을 입력하면 처음 scanf는 "ab"를 받아서 1을 반환(%s가 한개이므로)합니다 not이 붙었으므로 0이되어 t값은 증가하지 않습니다 그 다음 "-"라는 공백을 만나게 됩니다. 아무것도 읽어들이지 못했으므로 0이 반환되고 not이 붙어 1이되고 while문이 참이 됩니다.  t값은 증가합니다 이런식으로 EOF까지 가는 방식인가 보군요.

그런데, while문 안에 0이 들어가면("ab"를 읽기 성공) while 문은 종료가 되는데, EOF까지 도는 이유는 버퍼에 문자열이 남아있기 때문인가요? 

djm03178   4년 전

~는 not이 아니라, 비트를 뒤집는 연산자입니다. 1에 ~를 붙이면 -2가 됩니다. t는 루프를 돌 때마다 무조건 증가하는 것이고, scanf의 반환값이 -1이 아닌 동안 계속 돕니다.

그리고 -는 공백이 아닙니다. "ab-aa"를 %s로 읽으면 한 번에 전체가 다 읽힙니다.

luckyquit   4년 전

djm03178 님 감사합니다

-가 공백이라는 의미는 게시글에서 공백이 보이지 않을까봐 -라고 임의로 표기한겁니다.

상세한 답변 감사합니다. 항상 보면 djm03178님이 알려주시는거 같네요ㅎ


luckyquit   4년 전

djm03178 님 감사합니다 정확한 이해를 위해 한번만 더 질문드리고 싶습니다

공백이 안보일거 같아 임의로 -를 공백으로 표시하겠습니다. (eof) : 파일의 끝

ab(-)ab(-)aaa(\n)(EOF) << 입력받았을 경우 괄호는 무시.

1 loop : ab         -> read

2 loop : ab      -> read

3 loop :  aaa      -> read             

4 loop : EOF       --> false

와 같은 과정이 맞다면 좋아요 한번 그냥 눌러주시고, 틀렸다면 틀린 부분 지적해주시면 감사하겠습니다!

항상 많은 도움을 받네요 감사합니다


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