일반적으로, standard input에서 입력 받는 경우는 scanf와 cin만으로 충분하다고 생각했으나,
문제를 몇 개 풀면서 그게 아니라는 것을 알았다.
문자열이 공백을 포함하거나, 한 줄을 통째로 입력받는데 그것을 scanf 문 하나로 커버할 수 없는 경우
어려움이 생긴다.
공백을 포함하여 한 줄을 통째로 입력받아야 하는 경우,
그리고 그 크기도 짐작하기 어려운 경우에, 다음과 같이 받으면 된다.
string s; getline(cin, s);
이렇게 하면, 공백을 포함한 문자열이 통째로 s 안으로 들어온다. ( cin >> s 로는 불가능한 것.)
이 s를 가지고 stringstream 등으로 지지고 볶아서 각 원소를 분리해내면 된다.
________________________________________________________________
(2013. 07.17 추가)
입력의 크기가 매우 큰 경우, getline은 속도가 느려서 감당하기 힘들다.
이러한 경우, fgets를 활용하자.
char str[1024]; fgets(str,1024,stdin); string line(str); // string에 저장하기.
fgets(char *s, int num, FILE *ptr) 의 형태로 사용한다.
num은 입력받을 문자의 최대 길이, ptr은 파일 포인터이다.
fgets의 선언을 보면,
A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str. |
즉, newline character이 붙고, 맨 끝에는 자동으로 NULL문자가 추가된다는 것이다.
문자열에서 newline문자를 활용할 일이 별로 없으므로, string으로 변환하고 다루는 것이 훨씬 간편할 것이다.
'플랫폼 > C++' 카테고리의 다른 글
Stringstream 사용법 정리 (0) | 2013.07.17 |
---|---|
Reverse_iterator 에 대해서 (0) | 2013.05.31 |
lower_bound와 upper_bound (0) | 2013.05.30 |
pair의 크기 비교 방식 (0) | 2013.05.29 |