플랫폼/C++

공백을 포함해 한 줄 입력받기

방랑여행 2013. 7. 9. 17:28

일반적으로, 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.

A terminating null character is automatically appended after the characters 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