C++입출력

서재혁·2022년 7월 29일
0

C++

목록 보기
2/7

1. 입출력 헤더 파일

#include <iostream>
#include <cstdio>

2. 입력 함수

(1) cin

배열과 문자를 모두 입력받을 수 있다.

  • 버퍼 오버 플로우
    cin으로 입력 받는 배열의 크기를 넘어서는 문자열을 cin을 통해 입력 받으면, 배열의 크기를 넘어 다른 변수 소유의 메모리에 덮어쓰게 된다.
  • cin은 공백과 개행 문자를 입력 받지 못한다.
    cin을 연속으로 사용하여 2번의 문자열을 받을 때 공백을 만나면 다음 cin의 변수로 데이터가 넘어간다.

이러한 문제를 해결하기 위하여, 문자열을 입력 받을 때 getline() 함수를 사용한다.

getline

  1. 배열에 문자열 입력
    지정한 갯수 이상의 문자열을 입력 받으면 갯수만큼만 입력 받고, 공백 또한 포함하여 입력 받는다.
	char cs[20];
	cin.getline(cs, 20);
  1. string에 문자열 입력
    cin 명령어로 받은 문자열을 string 변수에 담는다.
    문자열 크기의 제한은 없다.
    공백 또한 포함하여 입력 받는다.
	string s;
	getline(cin,s);

중요

  • cin은 처음 입력된 white space를 무시한다.(enter, tab, 띄어쓰기)
  • cin은 개행문자를 저장하지 않는다('\n')
    하지만 cin은 위의 두 요소들을 버퍼에 남긴다.
  • getline(cin,string변수)는 개행문자와 공백을 모두 저장한다.
  • 버퍼에 남은 입력 값은 cin.ignore() 혹은 cin.clear로 정리한다.

cin.clear() - 버퍼 초기화
cin.ignore(무시할 문자의 최대 길이, 무시를 종료할 문자) - 버퍼 안에 있는 내용 무시, 인수 없이 사용 가능
cin.get() - 문자 하나를 입력 받는다.(공백 포함)

scanf

scanf는 c언어를 배울 때 처음 배우는 입력 함수이다.

정수 하나를 입력받을 때

int i;
scanf("%d", &i);

scanf에서 우리가 첫 파라미터로 입력한 값을 형식지정자라고 한다. 이 값을 잘 조정함으로 우리는 다양한 입력을 여러가지 방법으로 받을 수 있다.

예를 들어 123456789 라는 입력이 있을 때 이 입력을 9자리의 정수가 아닌 3자리의 정수 3개로 받을 수 있다.

int a, b, c;
scanf("%3d%3d%3d", &a,&b,&c);
// 반복문 형태도 가능
for(int i = 0;i < 3;i++)
	scanf("3d",&a);

형식지정자의 형태는 %[*][width][length]specifoer의 꼴이다.

*의 사용
*를 사용하면 입력을 무시할 수 있다.

scanf("%*d %d", &a);

1234 5678이란 입력이 주어진다면 1234는 무시되어 a는 5678이 된다.

무시할 글자의 길이를 지정해주면 공백으로 구분되어 있지 않은 입력도 일부분만 받을 수 있다.

scanf("%*3d%d", &a);

12345을 입력으로 주면 a는 456이 된다.

[]사용
[]내부에 있는 문자만 입력으로 처리한다는 뜻이다. 범위를 지정하는 것도 가능해서 "%[A-Za-z0-9]"와 같이 쓰면 스페이스바, 알파벳 대소문자와 숫자를 처리가능하다.

[^] 사용
[]와 반대이다. []내부에 있지 않은 문자만 입력으로 처리한다. "%[^\n]"과 같이 쓰면 엔터를 입력하기 전 모든 글자(공백 포함)를 입력 받을 수 있다.

scanf("%[^\n]", s);

3. 기본 출력 함수

cout, printf

4. 입출력 속도 증가

기본적으로 cin & cout는 scanf & printf 와 비교했을 때 속도가 현저히 느리다. 이 차이로 인해 시간초과가 나는 경우가 있다.
이 때 밑의 코드를 주입하면 cin & cout의 속도를 높일 수 있다.

ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

주의할 점
1. scanf, printf와 섞어 사용하지 말 것
2. 싱글 쓰레드 환경에서만 사용할 것(실무에서 사용하지 말 것)

웬만하면 scanf,printf를 사용하는 쪽으로..

출처 :
https://algwang.tistory.com/10
https://simsimjae.tistory.com/33
https://tempdev.tistory.com/5

profile
조금만 더

0개의 댓글