xodus0430   3년 전

' 'S' 'a' 'M' 'p' 'L' 'e' 'I' 'n' 'P' 'u' 'T' ' ' ' ' '

두 번째 줄부터는 첫 문자가 공백인 경우

S a M p L e I n P u T 그냥 S부터 받아오는데 왜 그러는지 이유를 알 수 있을까요? ㅠㅠ

dldyddlwl   3년 전

아래의 코드를 보시면, "%[a-zA-z 0-9]\n" 라고 되어있습니다. 그런데 scanf에게 끝을 공백을 주는 것은, 의도했던 바와는 조금 다르게 진행됩니다.

scanf는 위의 코드를 통해 입력받을 때, "%[]\n " 는 문자열, 하나 이상의 공백 문자(여기서는 \n도 공백입니다) , 그리고 공백문자가 @@아닌 값@@을 기다립니다. 

즉, 다음의 경우, 문제에 나온 예제입니다.

문제가 되는, 다음 예시 

SPACE    1    SPACE
 S a M p L e I n P u T     

1번째줄, SPACE    1    SPACE를 받고, 공백 이외의 문자가 올 때까지 기다립니다. 그렇다면, 다음줄 S a M ... 앞이 공백으로 시작하지만, 이전의 scanf가 공백이 아닌 값

이 올 때까지 기다리므로, 다음줄의 공백까지 먹어버립니다. 따라서, 다음 차례의 scanf가 시작될 때에는 공백이 아닌, 바로 S부터 시작하게 되는 것입니다.

쓰다보니, 뭔가 헷갈릴 수 있을 것 같군요. 비유를 하자면, 이어달리기를 하는데, 누군가가 제 바톤을 받아줘야 하는데 아무도 없어서(공백문자) 계속 제가 뛰고 있는 거라고 생각하면 됩니다. 그러다가 다음 주자 ( 공백이 아닌 문자 ) 가 나타나면, 비로소 저의 달리기(scanf)는 끝나게 됩니다. 

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