사용자가 입력한 "1 2 3 4 5 6 7 8 9 10<엔터>"는 일단 입력 버퍼에 저장되고,
scanf는 그 입력 버퍼에서 입력을 가져오는데
지정한 포맷 문자열에 따라 받아들일 수 없는 입력을 만나게 되면 그 시점에서 멈추고 종료합니다.
그래서 첫번째 스페이스(1과 2 사이에)를 만났을 때 더 이상 입력을 받는 것을 포기하고, 그 시점까지 받은 입력만 정수 1로 변환하여 a[0] 에 넣고 끝납니다.
이 시점에서 입력 버퍼에 " 2 3 ... 10<엔터>"가 남아 있고요.
루프를 반복하여 다시 scanf 가 실행되면 이 때 제일 앞에 있는 스페이스는 공백 문자니까 스킵하고(%d 포맷을 비롯한 여러 포맷의 경우 입력의 앞에 있는 공백은 스킵하게 되어 있습니다. 스킵하지 않는 건 %c를 비롯한 소수)
그 다음 "2"를 읽고
그 다음 " "를 보고 더 이상 입력받는 걸 포기하고 "2"만 2로 변환하여 a[1] 에 넣고 끝납니다.
이 시점에 입력 버퍼에는 " 3 4 ... 10<엔터>"가 남아 있고요.
사용자가 입력한 "1 2 3 4 5 6 7 8 9
사용자가 입력한 "1 2 3 4 5 6 7 8 9 10<엔터>"는 일단 입력 버퍼에 저장되고,
scanf는 그 입력 버퍼에서 입력을 가져오는데
지정한 포맷 문자열에 따라 받아들일 수 없는 입력을 만나게 되면 그 시점에서 멈추고 종료합니다.
그래서 첫번째 스페이스(1과 2 사이에)를 만났을 때 더 이상 입력을 받는 것을 포기하고, 그 시점까지 받은 입력만 정수 1로 변환하여 a[0] 에 넣고 끝납니다.
이 시점에서 입력 버퍼에 " 2 3 ... 10<엔터>"가 남아 있고요.
루프를 반복하여 다시 scanf 가 실행되면 이 때 제일 앞에 있는 스페이스는 공백 문자니까 스킵하고(%d 포맷을 비롯한 여러 포맷의 경우 입력의 앞에 있는 공백은 스킵하게 되어 있습니다. 스킵하지 않는 건 %c를 비롯한 소수)
그 다음 "2"를 읽고
그 다음 " "를 보고 더 이상 입력받는 걸 포기하고 "2"만 2로 변환하여 a[1] 에 넣고 끝납니다.
이 시점에 입력 버퍼에는 " 3 4 ... 10<엔터>"가 남아 있고요.
이 과정이 반복되면서 a[0], a[1], a[2], ... 가 각 숫자로 채워집니다.
좋은 하루 되세요!
댓글 달기