[C++] 입력과 출력

2023. 2. 10. 01:29Algorithm/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줄을 입력받기로 했는데 막상 한 줄을 입력하면 더 이상 입력받지 않는다.

 

그 이유는…

  1. 우리가 2를 입력하고 엔터를 친다.
  2. cin은 입력을 종료한다.
  3. 그 순간 키보드는 2\n을 입력받는다.
  4. T는 개행되기 전 즉, \n전까지 잘라서 입력을 받는다.
  5. 2T에 저장되지만 \n으로 생긴 한 줄은 input Buffer에 남아있다.
  6. for문의 getline이 실행되면서 아무 내용 없는 한 줄 \n이 입력된다.
  7. 그렇게 의도하지 않은 한 줄이 입력되어 버린다.

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