알고리즘/BOJ(C++)
[백준] 4458 :: 첫 글자를 대문자로 ( C++ 한 줄 입력받기, getline 함수 , cin.ignore())
쿠마쿠마34
2020. 12. 19. 16:50
반응형
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 |
반응형