C/C++ 입출력정리

김준영·2021년 3월 1일
0

C/C++, Assembly

목록 보기
2/2

C <stdio.h>

문자 입출력

int getchar(void);

stdin(표준입력)에서 문자를 입력
*getc(stdin) 과 동일

int putchar(int character)

stdout(표준출력)에 문자를 출력
*putc(character, stdout) 과 동일

C 스타일 String 입출력

char* gets(char* buffer)

stdin(표준입력)에서 buffer로 newline('\n')나 파일 끝(EOF)를 만날 때 까지 읽음 (이 때 문자열 끝에 null('\0')이 자동으로 추가됨)

*newline('\n')은 buffer에 포함되지 않는다.
주의할 점으로 fgets(buffer, num, stdin)에는 gets와 달리 newline도 포함되어 저장된다.

반환값은 인자로 전달받은 메모리의 주소, 에러 발생시 NULL

위의 gets함수는 버퍼 오버플로우에 의한 버퍼 오버런 공격에 대한 취약성을 가진다.

-> char gets(char buffer, size_t bufferSize) 로 대응할 수 있다

gets 과 fgets의 차이점 예시

char buf[10];
char ch;
gets_s(buf, sizeof(buf));
printf("gets_s str is %s\n", buf);
ch = getchar();
printf("left char is %c\n", ch);

fgets(buf, sizeof(buf), stdin);
printf("fgets str is %s\n", buf);
ch = getchar();
printf("left char is %c\n", ch);
입력: 777'\n'777'\n'777'\n' 
출력: 777
     gets_s str is 777
     left char is 7
     fgets str is 77
     
     left char is 7
int puts(const char* string)

stdout(표준출력)으로 string이 가리키는 주소부터 null('\0')에 도달할 때 까지 복사
(이 때 stdout에 string을 쓴 뒤 자동으로 newline('\n')도 추가되어 출력)

*마지막 null('\0')는 표준출력에 복사되지 않는다.
주의할 점으로 fputs(string, stdout)는 마지막에 newline('\n')을 추가하지 않는다.

반환값은 정상적이면 음수가 아닌 값, 에러 발생시 EOF

형식입출력

int printf(const char* format, ...)
int scanf(const char* format, ...)

scanf()와 gets()의 차이점

  1. scanf()는 whitespace, newline, EOF를 만나기 전까지 읽는 반면,
    gets()는 newline, EOF를 만날 때 까지 읽고 whitespace는 string으로 가져온다.
    (gets()는 깨끗한 반면, scanf()로 읽었을 때 버퍼엔 whitspace, newline,
    EOF가 남아있다.)
  2. scanf()는 각기 다른 자료형들의 다수의 변수를 읽을 수 있으나,
    gets()는 오직 character string data만을 가진다.

C++

iostream 객체 cin, cout

cin >> buf
cout << buf

cin >> int 변수 예시

int a, b, c, d, e;

std::cin >> a;
std::cin >> b;
std::cin >> c;
std::cin >> d;
std::cin >> e;

std::cout << "a: " << a << " b: " << b << " c: " << c << " d: " << d << " e: " << e;
입력: 1 2 3 4 5'\n'
출력: a: 1 b: 2 c: 3 d: 4 e: 5
*whitespace, newline을 만날 때 읽고, 만난 whitespace, newline은 버퍼에서 버린다. 

cin >> char* 변수 예시

char buf[30];
char ch;
std::cin  >> buf;
std::cout << buf << '\n';
std::cin  >> ch;
std::cout << ch << '\n';
입력: test string'\n'
출력: test'\n's'\n'
*whitespace, newline을 만날 때 읽고, 만난 whitespace, newline은 버퍼에서 버린다. 

cin, cout 객체 shift operator overloading 예시

class MyInfo {
	int x;
	int y;
public:
	MyInfo(int x = 0, int y = 0) : x(x), y(y) {}
	friend istream& operator >> (istream& cin, MyInfo& m);
	friend ostream& operator << (ostream& cout, MyInfo& m);
};

istream& operator >> (istream& cin, MyInfo& m) {
	cin >> m.x >> m.y;
	return cin;
}

ostream& operator << (ostream& cout, MyInfo& m) {
	cout << "x value is " << m.x << " and " << "y value is " << m.y << endl;
	return cout;
}

int main() {
	MyInfo m;
	cin >> m;
	cout << m;
}
입력: 123 45'\n'
출력: x value is 123 and y value is 45
*클래스 내에 멤버 변수로 작성하거나 클래스 외부에 작성하고 friend로 처리한다.

istream에 정의된 getline

istream& getline(char buf, streamsize n, char delim = '\n');
n-1개의 문자를 읽어들이거나, 제한자(delim)이 나타날 때 까지 읽는다.
(제한자는 추출되지만 버려진다)
반환값은
this
데이터 추출 후 자동으로 끝에 null('\0')가 붙게된다.
ex) cin.getline(buf, 100);

string에 정의된 getline

제한자(delim)의 default 값은 '\n'
제한자(delim)이 나타날 때 까지 읽는다.(제한자는 추출되지만 버려진다)

ex) getline(cin, buf);

profile
개인블로그

0개의 댓글