2023. 2. 10. 01:29ㆍAlgorithm/with C++
1. 입출력
C++의 대표적인 입출력 방법 2가지에 대하여 알아보자.
가. scanf와 printf
C언어에서도 배우는 방법이다.
형식을 지정해야 하는 점이 다소 번거롭다.
#include <iostream>
int a;
int main(){
scanf("%d", &a);
printf("%d", a);
printf("\n");
return 0;
}
나. cin와 cout
#include <iostream>
using namespace std;
int a;
int main(){
cin >> a;
cout << a << "\n";
return 0;
}
우선 사용을 위해서는 <iostream>
이라는 헤더파일을 include
해야한다.
또 using namespace std
도 해준다.
2. 그래서 뭐 써?
앞서 소개한 두 방법 모두 까다로운 점이 있다.
가. scanf와 printf
printf는 string 타입의 문자열을 출력할 때 조금 번거로움(하자)가 있다.
바로 할 순 없고 아래와 같이 해야 한다.
string s = "world";
printf("hello %s\n", s.c_str());
printf에서 문자열을 출력하려면 string 타입의 문자열을 char 타입의 포인터(char *)로 바꿔주어야 한다.
#include <iostream>
using namespace std;
int main(void)
{
string str = "hello world";
char str2[] = "hello world";
printf("str : %s\n", str); //error!
printf("str.c_str() : %s\n", str.c_str());
printf("str2 : %s\n", str2);
printf("str[0] : %c\n", str[0]);
return 0;
}
이 꼴 안 보려면 그냥 cout
을 사용하면 된다.
나. cin와 cout
2개의 문자열을 입력할 경우에는 아래와 같이 해야 한다.
#include <iostream>
using namespace std;
string a, b;
int main(){
cin >> a >> b;
cout << a << " ";
cout << b << "\n";
return 0;
}
/*
입력
hello world
출력
hello world
*/
입력을 받을 때 띄어쓰기와 엔터를 입력하면 끊어진다.
그렇기에 띄어쓰기를 고려해서 입력할 단어만큼의 변수를 준비해야 한다.
다. getline()
다행히도 한 문장을 한꺼번에 받는 방법이 있다.
using namespace std;
string s;
int main(){
getline(cin, s);
cout << s << '\n';
return 0;
}
getline()
이라는 것을 사용하면 문자열을 한 번에 받을 수 있다.
주의! cin 다음에 오는 getline
다 좋은데 주의할 점이 있다.
#include <iostream>
using namespace std; int T;
string s;
int main(){
cin >> T;
for(int i = 0; i < T; i++){
getline(cin, s);
cout << s << "\n";
}
return 0;
}
/*
입력
2
hello
출력
hello
*/
위와 같이 입력할 줄의 개수를 미리 지정하고 그 수만큼 입력받아 다시 출력하는 코드를 작성했다.
하지만 막상 실행하면 이상하게 돌아간다.
분명 2줄을 입력받기로 했는데 막상 한 줄을 입력하면 더 이상 입력받지 않는다.
그 이유는…
- 우리가 2를 입력하고 엔터를 친다.
cin
은 입력을 종료한다.- 그 순간 키보드는
2\n
을 입력받는다. T
는 개행되기 전 즉,\n
전까지 잘라서 입력을 받는다.2
는T
에 저장되지만\n
으로 생긴 한 줄은 input Buffer에 남아있다.- for문의
getline
이 실행되면서 아무 내용 없는 한 줄\n
이 입력된다. - 그렇게 의도하지 않은 한 줄이 입력되어 버린다.
cin
다음에 오는 getline
의 이러한 문제를 해결하기 위해서는 \n
을 따로 처리 즉 bufferflush를 수행한다.
#include <iostream>
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;
}
/*
입력
2
hello
world
출력
hello
world
*/
23.09.26일 추가
3. 붙어있는 입력을 분리하는 방법
44
1000
0000
0111
0000
가. string으로 변환
첫 번째는 string으로 받아 변환하는 방법.
#include<bits/stdc++.h>
using namespace std;
int n, m, a[10][10];
string s;
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> s;
for(int j = 0; j < m; j++){
a[i][j] = s[j] - '0';
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << a[i][j];
}
cout << '\n';
}
}
/*
44
1000
0000
0111
0000
1000
0000
0111
0000
*/
cin으로 받을 때는 개행문자(띄어쓰기, 한 줄 띄기)까지 받을 수 있다. 주의할 것.
나. scanf로 받기
#include <bits/stdc++.h>
using namespace std;
int a[10][10], n, m;
//char a[10][10]; //char형
int main(){
cin>>n>>m;
for(inti=0;i<n;i++){
for(intj=0;j<m;j++){
scanf("%1d", &a[i][j]); //int형
//scanf("%c", &a[i][j]); //char형
}
}
return 0;
}
특수문자, 개행문자(띄어쓰기, 한줄띄기)까지 받을 수 있다. 주의할 것.
4. 입력의 끝을 모를때
while(scanf("%d",&n) != EOF){...}
while(cin >> n){...}
while(getline(cin, str)){...}
'Algorithm > with C++' 카테고리의 다른 글
[C++] 메모리 할당 (0) | 2023.07.07 |
---|---|
[C++] 배열과 포인터 (0) | 2023.07.01 |
[C++] pair와 tuple (0) | 2023.07.01 |
[C++] string (0) | 2023.03.20 |
[C++] using namespace (0) | 2023.02.10 |