[C++] 백준 2557 , 입출력

YUN·2025년 8월 17일

C++

목록 보기
1/82

C++ 에는 3가지 입출력 방식이있다.

iostream, stdio.h, cstdio 이다.

📌 <iostream>

1. 사용법

(1) 공백/개행 단위로 읽기

만약 공백, , 개행 단위로 읽어내고싶으면 std namespace의iostream 헤더에 포함된 cin을 쓰면된다.

C++표준 입출력 방식이다.

#include <iostream>
using namespace std;

int main() {
	cout<<"Hello World!";
	return 0;
}

cin은 입력 버퍼에서 `공백, , 개행 단위로 읽어낸다.

(2) 공백, 탭 포함해서 읽기

만약 공백, 포함해서 한 줄 단위로 읽어내고싶으면 string 헤더에 포함된 getline(입력 스트림, 문자열 저장할 변수명)을 쓰면된다.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string fullName;
    cout << "이름을 입력하세요: ";
    getline(cin, fullName); 
    cout << "입력된 이름: " << fullName << endl;
    return 0;
}

위와같이 쓸 수 있다.

2. 풀이

#include <iostream>
using namespace std;

int main() {
    
    cout<<"Hello World!"<<endl;
    return 0;
}

📌 <stdio.h>

1. 사용법

C의 표준 라이브러리로, : C++ 은 기본적으로 C의 표준 라이브러리를 사용할 수 있다.

#include <stdio.h>

int main() {
    int a = 10;
    float b = 3.14;
    char c = 'A';
    char str[] = "Hello";

    printf("정수: %d\n", a);
    printf("실수: %f\n", b);
    printf("문자: %c\n", c);
    printf("문자열: %s\n", str);

	int age;
    float height;

    printf("나이 입력: ");
    scanf("%d", &age);  // int는 %d
    printf("키 입력: ");
    scanf("%f", &height); // float는 %f

    printf("당신은 %d살이고 키는 %.2fcm 입니다.\n", age, height);
    return 0;
}
  • printf형식 지정자 자리에 a, b, c, str 같은 것들이 들어간다고 생각하면된다.

(1) 공백,개행 단위로 읽기

  • scanf는 입력을 저장할 변수의 주소(&) 를 넘겨줘야 한다.

<참고> scanf가 버퍼를 읽는 방법

  1. 입력 버퍼의 앞에 나오는 연속적인 공백(스페이스, 탭, 개행 등)을 모두 무시

  2. 이후 나오는 숫자(부호 포함, 0~9)를 계속 읽음

  3. 숫자가 아닌 문자를 만나면 거기서 멈춤 (그 문자는 버퍼에 남음)

즉, 공백 or 개행단위로 데이터를 읽는다. 공백이든 개행이든 다 무시해버린다.

2. 형식 지정자

서식 지정자자료형예시
%dint (10진수 정수)10
%uunsigned int4294967295
%ffloat, double (실수)3.140000
%.2f소수점 둘째 자리까지 출력3.14
%lfdouble (scanf에서 double은 %lf, printf에서는 그냥 %f)
%cchar (문자)'A'
%s문자열 (char 배열)"Hello"
%x16진수 정수ff
%o8진수 정수17
%p포인터 주소0x7ffd...

%d, %f, %c, %s 정도만 알 면 될 듯하다.

3. 풀이

#include <stdio.h>

int main(){
    printf("%s\n","Hello World!");
    return 0;
}

📌 <cstdio>

C++에서 <cstdio\>는 C의 <stdio.h\>를 C++식으로 쓸 수 있게 만든 헤더임.

1. 차이점

  • <stdio.h>

C 스타일 헤더. 함수들이 전역 공간에 선언됨.

printf("Hello");   // 그냥 이렇게 씀
  • <cstdio>

C++ 스타일 헤더. 함수들이 std 네임스페이스 안에 들어감.

std::printf("Hello");  // std:: 붙여야 함`

2. 사용법

#include <cstdio>   // C++ 헤더

int main() {
    int age = 25;
    double pi = 3.14159;

    std::printf("나이: %d\n", age);        // 정수 출력
    std::printf("원주율: %.2f\n", pi);     // 소수점 2자리까지 출력
    int x;
    std::printf("정수 입력: ");
    std::scanf("%d", &x);   // 입력
    std::printf("입력한 값은 %d 입니다.\n", x);
    return 0;
}

그냥 namespace std에 선언되었다는거 말고는 <stdio.h> 와 사용법이 완전히 동일한 것 같다.

3. 풀이

#include <cstdio>

using namespace std;
    
int main() {
    printf("%s","Hello World!");
    return 0;
}

📌 성능

밑에서부터 순서대로 <iostream>, <stdio.h>, <cstdio> 이다.

<stdio.h><cstdio>는 메모리를 덜 쓰는반면, <iostream>은 메모리를 많이 쓰는 것을 확인할 수 있다.

📌 입출력 원리

운영체제에서 표준 입력(stdin)은 "줄 단위(line buffered)" 모드가 기본임 (터미널/콘솔 환경 기준).

사용자가 키보드로 한 글자 입력할 때마다 OS 내부의 임시 공간(터미널 드라이버 버퍼)에 저장됨

하지만, 프로그램(C의 scanf, getchar, fgets 등)이 그 입력을 "읽을 수 있는 상태"가 되려면 엔터(↵) 를 눌러야 함.

엔터를 치는 순간 → 지금까지 입력된 문자열(123 45\n)이 운영체제의 stdin 버퍼(라이브러리 레벨 버퍼) 로 흘러 들어감.

이후 프로그램의 scanf()가 호출되면, 그 stdin 버퍼에서 데이터를 꺼내 쓰는 것.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글