티스토리 뷰

백준에서 간단한 문제를 풀던 중 C++로 알고리즘을 해결할 때 알아두면 유용한 정보를 찾아 기록해놓기로 했다.

 

4458번: 첫 글자를 대문자로

첫째 줄에 줄의 수 N이 주어진다. 다음 N개의 줄에는 문장이 주어진다. 각 문장에 들어있는 글자의 수는 30을 넘지 않는다. 모든 줄의 첫 번째 글자는 알파벳이다.

www.acmicpc.net

 

getline() 입력받기

C++에서 스트링을 입력받을 땐 std::cin을 이용해 입력받는다. 하지만 입력받는 스트링이 공백을 포함할 때, 예를 들어 "Hello World C++"라는 스트링을 하나의 변수에 저장하기 위해선 getline()을 이용해 입력받아야한다.

string s;
getline(cin, s);

 

하지만 getline이 호출되기 전 받는입력이 있다면, 버퍼 개행문자가 남아있어 '\n'이 getline에 바로 입력되어버리는 현상이 발생한다. 이 때 cin.ignore을 이용한다면 버퍼를 비울 수 있다.

int n;
string s;

cin >> n;
getline(cin, s); // '\n'이 바로 입력으로 들어간다

cout << n << '\n'; //n 값 출력
cout << s << '\n'; //개행처리

 

 

 

cin.ignore()를 이용해 푼 4458번 문제

그런데 버퍼를 비운다는 개념으로 알고 사용했으나, 조금 더 알아본 결과 앞 글자 n개를 지운다는 개념을 적용하는게 더 적합하다고 할 수 있겠다. 위의 예시에서 cin.ignore()의 인자로 cin.ignore(3)을 주었을 때 실행 결과는 다음과 같다.

#include <iostream>

using namespace std;

int main() {
  int n;
  string s;

  cin >> n;
  cin.ignore();
  
  for(int i = 0; i < n; i++){
    getline(cin, s, '\n');
    s[0] >= 97 ? s[0] -= 32 : s[0];
    cout << s << '\n';
  }
}

 

 

cin.ignore(n) 예시

cin.ignore(4)를 주었기 때문에 앞의 4 글자(개행 포함)가 지워진 뒤, s를 입력받게된다. 알고리즘을 풀이할 때는 인자를 줄 일이 거의 없을 것 같지만 버퍼를 비운다는 개념과는 상이하단 것은 알고 사용해야겠다.

int n;
string s;

cin >> n;
cin.ignore(4);

getline(cin, s);
cout << s << endl;

실행결과

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함