작성
·
49
1
jack jack 주황색 앞 부분이 첫번째 cin 에 들어가고 뒤에 jack과 엔터가 버퍼에 남는 다고 알려주셨는데 그럼 your age 에 jack이 하나만 들어가야 맞는게 아닌가요? 왜 jack이 두개나 들어가나요? 이해가 안돼요
답변 2
0
안녕하세요? 질문&답변 도우미 durams입니다.
정말로 age
변수에 jack이 두 개가 들어간 것이 맞을까요? 디버거를 통해 확인해보셨으면 좋겠습니다. 얼핏 봤을 때에는 age
에 "jack jack"
이 들어간 것처럼 보이긴 합니다만, 다시 아래 사항에 유의하여 생각해보세요.
사용자가 입력한 문자열과 프로그램이 출력하는 문자열의 구분
줄바꿈이 어디에서 일어나는지 확인
고민해보시고 그래도 해결이 안 된다면, 다시 댓글을 달아주세요.
name에 대해 입력을 받을 때 공백을 포함한 문자열을 입력하게 되면 결과 name과 age를 바로 출력하는 동작을 말씀하시는 것 맞나요?
이는 buffered i/o라는 입출력 방식 때문입니다. 간단하게 말씀드리자면, 입력을 받고자 할 때 버퍼에 내용이 이미 들어와있을 때에는 해당 내용을 사용하고, 버퍼가 비어 있다면 새로 입력을 받게 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 윤주헌님.
C++에서 cin
을 사용해 문자열을 입력받을 때, 빈칸(공백)은 새로운 입력의 시작을 의미하기 때문에 첫 번째 cin
연산에서는 공백 앞의 문자열만을 받아들입니다. 즉, "jack jack"
이라는 입력은 처음에 "jack"
만 name
에 저장하고, "jack"
과 엔터
(\n
)는 입력 버퍼에 남습니다.
이후 두 번째 cin
연산이 실행될 때, 버퍼에 남아 있던 "jack"
이 입력받아지고, 버퍼는 엔터
(\n
)만 남게 됩니다. 이는 두 번의 cin
연산이 빠르게 연속적으로 사용되기 때문에 발생하는 일반적인 현상입니다.
이와 관련된 문제를 해결하려면, getline(cin, string)
함수를 사용하는 것이 좋습니다. getline
은 줄바꿈 문자까지 포함하여 한 줄 전체를 입력받기 때문에 공백도 포함된 전체 문자열을 변수에 저장하게 됩니다. 이렇게 하면 모든 공백도 무시하지 않고 포함되므로, 공백으로 분리되는 문제를 걱정할 필요가 없습니다.
이미지를 통해 자세한 코드를 분석하지 않았지만, cin.ignore()
나 getline
과 같은 추가 함수들을 통해 이 문제를 해결할 수 있습니다.
관련 질문 링크:
- 문자열 중간에 빈칸이 있을 때 age로 넘어가는 문제
- cin에 빈칸이 있는 문자열 넣을 때 문제
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
해결됐습니다. 그런데 버퍼시에는 커서가 움직이지 않고 바로 변수 name과 age를 출력하네요? 이건 왜 그런건가요?