C에서 입력을 가져오는 경우
- 실행 중에 캐릭터 배열이 얼마나 할당되어 있는지 알 수 없다.
- scanf는 경계 검사를 하지 않음. → 5개로 할당이 되어있다면, 그것을 넘는 글자 수를 받았을 때, 지정되지 않은 메모리를 접근하려고 할 것이다.
- char first_name[20]; scanf(%s", first_name);
C++에서 입력을 가져오는 경우
scanf() 와 cin
- cin 또한 char 배열의 길이를 모른다.
- scanf()와 같은 위험성이 있다.
- 이를 피하려면 setw()를 사용하면 된다.
char first\_name\[20\]; cin >> first\_name;
char name[4];
cin >> setw(4) >> name;
스트림 상태
: 읽어오다가 실패했을 때 상태를 저장한다.
- namespace - ios_base
bit flag
- goodbit: 문제없음
- eofbit: 파일 끝
- failbit: string을 int로 읽으려고 하는 등 실패함
- badbit: 어떤 문제가 발생함
- method
- good()
- eof()
- fail()
- bad()
스트림 상태 확인 예제
int number;
cin >> number;
- 456abc → eofbit: unset → failbit:unset : 456을 잘 읽었고, 파일 포인터는 a를 가리키고 있음.
- 456 → eofbit: (un)set → failbit:unset : 456뒤 개행이 있으면 eof를 만나지 않음.
- abc → eofbit: unset → failbit:set : 문자를 int로 읽으려고 함.
- eof → eofbit: set → failbit:set : eof를 만났으므로 저장하지 못하고 종료.
입력 버리기
- 스트림 상태가 안 좋을 때, 입력을 무시하고 정상적인 입력을 다시 받고자 함.
- 이 경우, 입력을 새로 받기 전, 스트림을 비워주어야 한다.
- clear()
- stream을 좋은 상태로 돌려준다.
- 문제가 생겼을 때 켜진 비트를 다시 꺼준다.
- ignore()
- 파일 끝에 도달하거나 지정한 수만큼 문자를 버리면 멈춘다.
cin.ignore() // 문자를 1개 버림.
cin.ignore(10) // 문자를 10개 버림.
/* eof가 아니라 특정 문자를 지정해주기 */
cin.ignore(10, '\n'); // 문자를 10개 버림, 그 전에 \n을 만나면 멈춤.
cin.ignore(LLONG_MAX, '\n'); // 최대 문자 수를 버림. 그 전에 \n을 만나면 멈춤.
// 한 줄을 모두 버리는 방법
get()
- \n을 만나기 전까지의 모든 문자를 가져온다.
- \n문자는 입력 스트림에 남아있다.
get(name, 100);
// 99개의 문자('\0' 때문에)를 가져오거나 개행이 나올 때까지 문자를 가져옴.
//가져온 문자는 char배열에 배치함.
get(name, 100, '#');
// 99개의 문자를 가져오거나 '#'이 나올 때까지 문자를 가져옴.
//가져온 문자는 char배열에 배치함.
getline()
- 개행 문자를 만나기 전까지 모든 문자를 가져옴.
- 개행 문자는 입력 스트림에서 버린다
getline(name, 100);
// 99개의 문자('\0' 때문에)를 가져오거나 개행이 나올 때까지 문자를 가져옴.
//가져온 문자는 char배열에 배치함.
getline(name, 100, '#');
// 99개의 문자를 가져오거나 '#'이 나올 때까지 문자를 가져옴.
//가져온 문자는 char배열에 배치함.
'Language > C++' 카테고리의 다른 글
[C++] 5.Unmanaged Programming: 문자열(string) (0) | 2024.01.21 |
---|---|
[C++] 4.Unmanaged Programming: 참조(Reference) (0) | 2024.01.21 |
[C++] 2.Unmanaged Programming: 출력형식 지정(output formatting) (0) | 2024.01.21 |
[C++] 1.Unmanaged Programming: namespace (0) | 2024.01.21 |
[C++] 0.Unmanaged Programming (0) | 2024.01.19 |