문제 링크
난이도 : 브론즈 3
문제 내용
문장을 읽은 뒤, 줄의 첫 글자를 대문자로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 줄의 수 N이 주어진다. 다음 N개의 줄에는 문장이 주어진다. 각 문장에 들어있는 글자의 수는 30을 넘지 않는다. 모든 줄의 첫 번째 글자는 알파벳이다.
출력
각 줄의 첫글자를 대문자로 바꾼뒤 출력한다.
문제 분석
N 입력받고 n만큼 반복
첫 글자만 대문자화해서 바로 출력하고 줄바꿈
대문자 A의 아스키코드는 65
소문자 a의 아스키코드는 97
따라서 소문자를 대문자화 하려면 -32하면 됨
작성한 코드
// 250213
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
string s;
cin >> n;
cin.ignore(); // 입력 전 버퍼 비우기
while(n--){
getline(cin, s, '\\n'); // 개행문자 미포함 한 줄 받기
if (s[0] > 96 && s[0] < 123) s[0] -= 32;
cout << s << "\\n";
}
}
하다가 문제가 발생
- 아무생각없이 scanf 받다보니 띄어쓰기 들어오면 뒷 부분이 무시됨
- 그래서 cin.getline 했는데, 뭔가 오류가 뜸
- 알고보니 구분자를 “\n”로 해서 오류가 났던것, ‘\n’로 고치니 문제 해결됨
- 근데? N 입력받은 다음에 갑자기 끝나버림
- 버퍼에 개행문자가 남아있어서 생긴 문제. cin.ignore()로 버퍼 비우니 성공함
- cin.ignore()는 매개변수가 없으면 다 비우고, 있으면 그 개수만큼 비움
우수 코드 분석
#include<stdio.h>
int n;
char s[44];
int main(){
for(scanf("%d\\n", &n);n--;)gets(s), s[0]+=s[0]>='a'?'A'-'a':0, puts(s);
return 0;
}
이분은 아예 C 스타일로 짜심
s[0] += s[0] ≥’a’?’A’-’a’:0
첫 글자가 소문자 a보다 크면 대문자 A에서 소문자 a를 뺸 만큼(-32) 더한다 ⇒ 대문자화 한다