대표적으로 cin과 scanf가 있다. cin은 개행문자 직전까지 입력을 받고 scanf는 형식을 지정해서 입력을 받는다.
#include <bits/stdc++.h>
using namespace std;
int a;
int main(){
cin >> a;
scanf("%d", &a);
return 0;
}
문제에서 형식을 기반으로 입력이 주어지지 않은 경우scanf보다는 cin을 쓰는 것이 좋다. cin은 개행문자(띄어쓰기, 엔터)직전 까지 입력을 받는다.
#include <bits/stdc++.h>
using namespace std;
string a;
int main(){
cin >> a;
cout << a << "\n";
return 0;
}
/*
입력 :
코딩 화이팅
출력 :
코딩
*/
개행문자를 넣어서 2개의 문자열을 입력하면 다음 코드처럼 모든 문자열이 올바르게 입력 받아진다.
#include <bits/stdc++.h>
using namespace std;
string a, b;
int main(){
cin >> a >> b;
cout << a << "\n";
cout << b << "\n";
return 0;
}
/*
입력 :
주홍철 바보
출력 :
주홍철
바보
*/
scanf는 첫 번째 매개변수로 받는 형식을 지정해서 입력 받는다.
int scanf ( const char * format, ... );
#include <bits/stdc++.h>
using namespace std;
int a;
double b;
char c;
int main(){
scanf("%d %lf %c", &a, &b, &c);
printf("%d\n", a);
printf("%lf\n", b);
printf("%c\n", c);
return 0;
}
/*
입력 :
23330
233.23123
a
출력 :
23330
233.231230
a
*/
scanf는 주로 입력 형식이 까다롭거나 이를 이용해야 할 때 사용하는 게 좋고, 보통은 cin을 쓰는 게 좋다.
double타입으로 들어오는 것을 double타입으로 받을 수 있지만 scanf를 이용해서 int타입 2개로 받을 수 있다.
#include <bits/stdc++.h>
using namespace std;
int a, b;
double c;
int main(){
scanf("%d.%d", &a, &b);
printf("\n%d %d\n", a, b);
scanf("%lf", &c);
printf("%lf\n", c);
return 0;
}
/*
입력 :
3.22
3.22
출력 :
3 22
3.220000
*/
실수 타입의 연산은 굉장히 까다롭기 때문에 이런 트릭을 써서 정수타입 기반의 연산을 유도하기도 한다.
cin은 개행문자 직전까지 입력을 받는데, 한꺼번에 받으려면 getline으로 받으면 된다.
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
getline(cin, s);
cout << s << '\n';
return 0;
}
/*
김혜주 화이팅
김혜주 화이팅
*/
하지만 cin으로 T개의 getline을 받을지를 설정하고 T개 만큼 getline의 입력이 들어오는 상황이 있다. 그럴 때는 특정 문자열을 기반으로 버퍼플래시를 하고 받아야 한다. 이 이유는 cin으로 입력을 받을 때 개행문자 직전 까지 입력을 받게 되고, 이 때문에 중간에 위치한 버퍼에 \n이 남아있게 된다.
이 버퍼의 개행문자를 없애주기 위해 getline(cin, bufferflush)를 해주어야 한다.

c.f 개행문자 : 한 칸 띄어쓰기, 한 줄 띄어쓰기를 의미
#include <bits/stdc++.h>
using namespace std;
int T;
string s;
int main(){
cin >> T;
string bufferflush;
getline(cin, bufferflush); // 개행문자 제거
for(int i = 0; i < T; i++){
getline(cin, s);
cout << s << "\n";
}
return 0;
}
cout와 printf가 있다.
cout << 출력할 것 <<"\n"해서 하는게 일반적이다. 저렇게 “한줄” 띄어쓰기를 넣어도 되고 “한칸” 띄어쓰기를 원한다면 cout << "출력할 것" << " "; 이렇게 넣어도 된다. << 이어서 입력할 문자열이나 문자를 넣어도 된다.
#include<bits/stdc++.h>
using namespace std;
string a = "기메주 화이팅! ";
string b = "노래 너무 좋다...";
int main(){
cout << a << '\n';
cout << a << " " << "" << b << '\n';
return 0;
}
/*
기메주 화이팅!
기메주 화이팅! 노래 너무 좋다...
*/
cout은 기본적으로 실수를 출력하면 일부분만 출력이 된다. cout를 사용해 실수 타입을 출력하고자 한다면?
예를 들어 문제에서 소수자리 6자리까지 반올림해서 출력해야 한다고 해보자. 다음 코드 처럼 cout.precision(자릿수 + 1); 를 걸어 정해주면 된다.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double a = 1.23456789;
int main(){
cout << a << "\n"; // 1.23457
cout.precision(7);
cout << a << "\n"; // 1.234568
return 0;
}
printf는 형식을 지정해서 출력할 때 좋다. 다음 코드처럼 형식(format)을 정한 후 다음 매개변수로 변수를 넣으면 형식에 맞춰 출력된다printf는 형식을 지정해서 출력할 때 좋다. 다음 코드처럼 형식(format)을 정한 후 다음 매개변수로 변수를 넣으면 형식에 맞춰 출력된다`.
int printf ( const char * format, ... );
#include<bits/stdc++.h>
using namespace std;
int a = 1, b = 2;
int main(){
printf("홍철 %d : 지수 %d\n", a, b);
return 0;
}
/*
홍철 1 : 지수 2 */
printf의 출력형식을 이용해 소수점 6자리까지 그리고 2를 02, 또는 12는 12 이런식으로 출력하려면?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double a = 1.23456789;
int b = 12;
int c = 2;
int main(){
printf("%.6lf\n", a);
printf("%02d\n", b);
printf("%02d\n", c);
return 0;
}
/* 1.234568
12
02
*/
다음은 형식 지정해서 출력하는 모습이다.
#include <bits/stdc++.h>
using namespace std;
int a = 1;
char s = 'a';
string str = "안녕";
double b = 1.223123;
int main(){
printf("안녕 : %d\n",a);
printf("안녕 : %c\n",s);
printf("안녕 : %s\n",str.c_str()); // 주의
printf("안녕 : %lf\n",b);
return 0;
}
/*
안녕 : 1
안녕 : a
안녕 : 안녕
안녕 : 1.223123
*/
위의 코드를 보면 string str을 출력할 때는 c_str() 함수를 걸어서 출력하고 있다. 문자열을 printf로 출력할 때 주의할 점!
printf 를 기반으로 문자열을 출력하려면 string을 문자열에 대한 포인터(char *) 타입으로 바꿔주어야 하기 때문이다.(그래서 보통 문자열을 출력할 때는 간단히 cout을 사용하는 것이 좋습니다.)