알고리즘/BOJ(C++)

[백준] 4458 :: 첫 글자를 대문자로 ( C++ 한 줄 입력받기, getline 함수 , cin.ignore())

쿠마쿠마34 2020. 12. 19. 16:50
반응형

www.acmicpc.net/problem/4458

 

4458번: 첫 글자를 대문자로

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

www.acmicpc.net

 

원래 이 문제는 너무 간단해보여서 포스팅 안하려다가 

딱 하나 정리하려고 쓴다. 

 

테스트 케이스 만큼 한 줄 씩 입력받아야하는데, 

cin>> 이렇게 쓰면 공백을 기준으로 변수가 저장된다. 

 

그래서 "You are lovely" 이런 문장을 쓰게 되면 You 까지만 입력이 된다. 

 

 

한 줄을 통째로 입력 받으려면 getline을 써야한다. 

ex) getline(cin,str) 

이렇게 쓰게 되면 '\n'을 기준으로 구분하여 입력을 받을 수 있게 된다. 

 

이제 완벽하다고 생각했는데 자꾸 테스트 케이스가 5개인데 한개가 덜 입력되는 현상이 발견했다. 

문제가 무엇인가 했더니, getline을 사용하면 cin.ignore()이 필요했기 때문이었다. 

 

그렇다면 getline을 사용할 때 cin.ignore은 왜 필요한걸까

앞서 테스트케이를 입력받을 때 cin>>T 이렇게 cin을 한번 썼는데, 이 떄 cin은 \n을 입력 버퍼에 남겨둔다. 

그렇기 때문에 geline은 '\n'을 입력을 받기 때문에 앞에 남은 \n을 하나 입력받고, 테스트케이스 개수를 하나 까먹는 것이다. 

 

다음엔 안까먹고 실수 안하기 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
using namespace std;
 
string s;
int T;
int main() {
    /*
    a: 97
    z : 122
    A : 65
    Z : 90*/
    
    cin >> T;
    cin.ignore();
    while (T--) {
        getline(cin, s );
        if (s[0>= 97 && s[0<= 122) {
            s[0-= 32;
        }
        cout << s << endl;
    }
}
cs

 

반응형