jisuho   1년 전

1번 코드는 정답과 같은 출력이 나오는데 2번 코드는 다른 출력이 나옵니다.... cin.ignore()의 위치만 바뀌었을 뿐인데 왜 출력이 다른걸까요..?

luaselly   1년 전

두 코드의 차이는 cin.ignore()의 위치인데, 이 위치에 따라 프로그램의 동작이 달라지는 이유는 cin >> n 이후 입력 버퍼에 남아 있는 개행 문자 \n 때문입니다.

cin >> n은 숫자만 읽고 줄바꿈 문자는 버퍼에 남겨두는데, 이 상태에서 바로 getline()을 호출하면 남아 있던 \n을 그대로 읽어서 빈 문자열을 가져오게 됩니다.

그래서 2번 코드처럼 cin.ignore()를 반복문 안에 두고 매번 호출하면, 첫 번째 반복에서 그 \n만 읽고 실제 입력 문자열은 그다음 반복부터 읽게 되는 거예요.

결국 첫 줄은 무시되고 두 번째 줄부터 출력하게 되니 결과가 달라지는 거죠.

1번 코드처럼 cin.ignore()를 반복문 전에 딱 한 번 호출하면 cin >> n 이후의 남은 \n을 미리 제거해주기 때문에, 그 다음 getline() 호출부터는 정확히 한 줄씩 읽을 수 있어요.

그래서 1번 코드는 정확한 출력이 되는 거고요.


cin >> n 뒤에는 항상 개행 문자가 남고, getline()을 쓰기 전에 그걸 cin.ignore()로 처리해줘야 하는데, 그걸 언제 하느냐에 따라 입력 처리 방식이 달라진다는 거예요.

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