Input

headkio·2020년 9월 9일
0

C++

목록 보기
2/35
post-thumbnail

cin

scanf()를 어느정도 대체

int price;
cin >> price;
cout << price;

float price
cin >> price;
cout << price;

scanf가 위험한 이유

scanf는 (char*) 경계 검사를 하지 않는다.

문자열의 끝을 알 수 없기 때문에 마지막을 null로 판단한다.

cin도 같다.

// C에서 경계 검사 문제 해결
char line[512];
char temp[512];
char firstName[4];

if (fgets(line, 512, stdin) != NULL) 
{
	if (sscanf(line, "%s", temp) == 1 && strlen(temp) < 4) 
	{
		strcpy(firstName, temp);
	}
}
// C++ 에서 경계 검사 문제 해결
char firstName[4];
cin >> setw(4) >> firstName;

Stream States

cin >> line;
if (!cin.eof()) // end of file
{
	// ...
}

istream

  • namespace : ios_base
  • bitflag
    • goodbit
    • eofbit
    • failbit
    • badbit
  • method
    • good()
    • eof()
    • fail()
    • bad()

case 2

console에서 입력후 enter를 쳤을땐 eofbit = unset

text file로 읽어서 enter를 없을때 eofbit = set

입력 버리기

cin.clear(); // 정상상태로 만들기

cin.ignore(); // 문자 1개 버림
cin.ignore(10); // 문자 10개 버림
cin.ignore(10, '\n'); // 10개 버림, 단 개행(\n)을 버리면 멈춤
cin.ignore(LLONG_MAX, '\n') // 최대 문자 수를 버림, 단 개행(\n)을 버리면 멈춤

get()

개행을 만날 때 까지 모든 문자를 가져옴

개행 문자는 입력 스트림에 남아 있음

// 99개를 가져옴
get(name, 100);

// 99개를 가져오거나 '#'을 만나면 멈, '#'은 저장하지 않음
get(name, 100, '#');

getline()

개행을 만날 때 까지 모든 문자를 가져옴

개행 문자는 입력 스트림에 버림

getline(name, 100);
getline(name, 100, '#');
profile
돌아서서 잊지말고, 잘 적어 놓자

0개의 댓글