입력

이동규·2024년 12월 3일

C++

목록 보기
4/16

scanf가 위험한 이유

  1. Buffer Overflow scanf는 입력 버퍼 크기를 명시적으로 제한하지 않으면 데이터가 배열의 크기를 초과 할 수 있다.

int main(int argc, char const *argv[])
{
    char name[3]; // l e e 개행문자가 없다.
    scanf("%s", name);
    
    // 해결 방법
    char bigName[4]; // l e e \0 개행 문자가 았다.
    
   scanf("%s", name);
   scanf("%s", bigName);
   printf("%s %s", name, bigName);
   /* code */
 	return 0;
}

cin을 사용하자

setw(w) 기본적으로 출력의 폭을 설정한다.하지만 입력의 길이도 제한에도 유용하다.

#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char const *argv[])
{
    char firstName[4];
    cin >> setw(4) >> firstName; // cin은 개행문자 포함이다.
	// 글자수 3개 + \0 개행문자(널포인터)
    cout << firstName << endl;
    /* code */
    return 0;
}

스트림 상태

NULL은 직관적이지 않다.

#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
    int number;
    cin >> number;
// abc 일 때 unset eof는 a를 가르키고 unset이다.
// 456 마지막에 eof 할때 newline 키워드가 있을 때 unset이다.
// 456을 입력하고 바로 넣을수 있다.그러면 eofbit set이다.
    return 0;
}

0개의 댓글