본문 바로가기
C++/라이브러리 (STL etc)

[c++] cin.getline() vs getline() 및 cin.ignore() 정리

by 스프링섬머 2023. 7. 14.
728x90
1. cin.getline(char 배열, 넣을 문자수)

넣을 문자 수만큼만 char 배열에 저장한다.

저장은 각각의 알파벳이 원소 하나하나에 할당됨.

공백도 같이 저장한다
(cin >> 은 공백 전까지 장, cin.getline()은 공백 포함 개행문자 전까지 저장)

 

# 넣을 문자 만큼 받는다.

 

2. getline(cin, string) from #include <string>

getline()string에 정의되어 있으며, string 형의 문자열 저장.

 

# getline(cin, string, ‘특정문자’) : 특정문자 전까지의 문자열을 받는다.

 

※ 주의사항, cin.ignore()
  • 일반적인 cin >> a;와 같이 입력 받고, getline() 혹은 cin.getline()을 사용할 시에는 재대로 동작하지 않는다.
  • 이유는, cin >> a; 이후에 개행문자(“\n”)가 입력버퍼에 남아 있기 때문에 이 문자가 getline() 혹은 cin.getline()에 입력으로 들어가기 때문이다.
# 에러상황

  • 출력에서 2다음에 빈 공간이 보인다. 이것은 개행문자가 s에 입력된 것이다.
  • 2num으로 받고, 그 다음에 getline()을 수행시 개행문자(“\n”)가 입력버퍼에 남아있어 s에 들어간다.

 

# 해결방법, cin.ignore()를 통해 입력버퍼 비우기

  • 2를 num에 입력받고, clear도 s에 잘 입력받은 모습을 볼 수 있다.

 

그럼 언제 cin.ignore()를 해서 입력버퍼를 비워줘야 할까?
  • 딱 2가지이다.
  • 1) cin >> a; 와 같이 일반적인 입력.
  • 2) a = cin.get(); 상황시
  • 일반적인 cin >> a;와 같이 수행하고, getline() 혹은 cin.getline()을 수행할 때에만 해주면 된다.
  • , getline() 간에나, cin.getline() 간에는 입력버퍼에 개행문자(“\n”)이 저장되지 않아 상관없음.

# 1. getline() <-> getline() 문제 없음.

  • s1 = ‘a b c’, s2 = ’d e f’ 가 문제없이 입력됨.

# 2. getline() <-> cin.getline() 문제 없음.

  • s1 = ‘a b c’, a = ’d e f’ 가 문제없이 입력됨.
# 3. cin.getline() <-> cin.getline() 문제 없음.

 

728x90