#include <stdio.h>

int main(){
    int i=0;
    scanf("%d\n",&i);
    printf("%d\n",i);
    scanf("%d",&i);
    printf("%d\n",i);
    return 0;
}

scanf는 문자가 매칭이 안 되고 다음 문자가 whitespace가 아닐 때 까지 읽고 문자열이 남을 경우 나머지를 버퍼에 남긴다.

scanf에 \n이 들어갈 경우 줄바꿈이 매칭되므로 scanf가 종료되지 않고 다음 readable character가 들어올 때 까지 대기한다.

이 예시의 경우 format string에 conversion specification이 하나밖에 없으므로 첫 readable character을 i에 쓰고 버퍼에 다음 character를 남긴다. 그래서 다음 scanf() 호출 시에 아무것도 입력하지 않아도 그 전에 입력했던 문자열을 버퍼에서 읽어와 출력하게 된다.

(K&K 2/E p.46 참고)

결론: scanf 끝에 줄바꿈 문자를 넣지 말자

특별한 상황에서는 쓸 수도 있겠지만… :)