티스토리 뷰
[c/C++] 문자열 입력 cin() getline() 버퍼오버플로우
문자열을 입력받을 때, cin >> 을 보통 사용한다.
하지만 cin 으로 문자열을 입력받을 때 문제점들이 있다.
(1) 버퍼 오버플로우
cin으로 입력받는 배열의 크기를 넘어서는 문자열을 cin 을 통해 입력받으면, 배열의 크기를 넘어 다른 변수 소유의 메모리에 덮어쓰게 된다.
(2) cin은 공백과 개행문자를 입력받지 못한다.
cin 을 연속으로 사용하여 2번의 문자열을 받을 때 공백을 만나면 다음 cin의 변수로 데이터가 넘어간다.
예를들어, I'm Hyeon 을 입력하면, I'm 은 첫번째 변수에 Hyeon은 두번째 변수에 들어간다.
공백처리를 하지 못하게 된다.
이러한 문제를 해결하기 위하여, 문자열을 입력받을 때 getline() 함수를 사용한다.
(1) 배열에 문자열 입력
char cs[20];
cin.getline(cs, 20);
위와 같이 사용하면 입력받은 문자열이 cs 배열에 대입된다.
여기서 20개 이상의 문자열을 입력받으면, 20까지만 입력받게되고, 공백또한 포함하여 입력받는다.
(2) string에 문자열 입력
string cpps;
getline(cin, cpps);
cin 명령어로 받은 문자열을 cpps string 변수에 담는다.
문자열 크기의 제한은 없다.
공백또한 포함하여 입력받는다.
중요!!
1.cin 은 처음 입력된 white space를 무시한다 (엔터,탭,띄어쓰기)
2.cin 은 개행문자를 저장하지 않는다 ('\n')
3.getline(cin,string 변수); 는 개행문자와 공백을 모두 저장 한다 ('\n')
예제
string a;
while(1)
{
cin>>a;
}
이런 프로그램이 있을때 처음 문자열을 입력받아서 스트링 a에 저장한다.
그런데 cin은 입력을 받을때 '\n'는 입력 받지 않기 때문에 입력 버퍼에 '\n'이 그대로 남아있다.
그다음 반복문에서 입력을 받기 시작하면 '\n'부터 입력을 받기 시작하는데,
cin은 처음 입력된 '\n'을 무시하기 때문에 정상적으로 계속해서 문자열 입력을 받을수 있다.
cin.get()
문자 하나를 입력받는데, 공백문자도 하나의 문자로 취급한다. 즉 엔터키와 띄어쓰기도 하나의 문자로써 취급을 한다는것이다.
int a = cin.get(); 에서 입력한 문자가 'b' 일 경우 문자 b에 대한 아스키 코드값이 a에 저장되게 된다.(입력을 character형으로 받기 때문에)
'알고리즘' 카테고리의 다른 글
[c/c++] 널문자 0 '\0' 널문자열 NULL 의 차이 및 개념 (0) | 2017.08.27 |
---|---|
[c/c++] char배열과 문자열의 차이 (0) | 2017.08.27 |
백준 2608 로마 숫자[올림피아드2004 초등부 5번] (0) | 2017.08.27 |
백준 1057번 토너먼트(시뮬레이션) (0) | 2017.08.25 |
백준 2606번 바이러스 (bfs/플로이드-와샬 알고리즘) (1) | 2017.08.25 |
- Total
- Today
- Yesterday
- async
- server side rendering
- useEffect
- typescript
- Next.js
- javascript
- webpack
- useRef
- return type
- storybook
- react hooks
- reactdom
- mobx
- hydrate
- es6
- Action
- Babel
- state
- Polyfill
- await
- atomic design
- props
- type alias
- reflow
- rendering scope
- promise
- computed
- reducer
- design system
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |