stringstream을 사용하면 타입 변환이나 token 단위의 전달이 가능하다.
그런데 공백을 포함한 문자열을 stringstream으로 흘려보내면 공백으로 구분된 단어 단위로 잘리는 효과가 발생하여 작성자의 의도와 다르게 동작할 수 있다.
다음 예제에서 첫번째 블럭의 결과는 첫번째 단어만 복사됨을 알 수 있다.
#include <iostream>
#include <sstream>
using namespace std;
int main(void)
{
stringstream ss;
string original = "foolish me";
string round_trip;
ss << original;
// tokenized within a word
ss >> round_trip;
cout << original << endl;
cout << round_trip << endl;
return 0;
}
foolish me
foolish
iomanip 라이브러리에 정의된 quoted() 함수를 사용하면 공백에 의한 잘림 효과없이 통째로 전달이 가능하다.
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main(void)
{
stringstream ss;
string original = "foolish me";
string round_trip;
ss << quoted(original);
ss >> quoted(round_trip);
cout << original << endl;
cout << round_trip << endl;
return 0;
}
정상적으로 복사됨을 확인할 수 있다.
foolish me
foolish me
quoted() 함수를 사용하면 실제로 겹따옴표(")를 이용하여 하나의 문자열로 묶어주는 효과가 발생한다. 문자열 내부에 겹따옴표가 존재한다면 escape되는 것을 확인할 수 있다.
#include <iostream>
using namespace std;
int main(void)
{
cout << quoted("She said \"Hi!\"") << endl;
return 0;
}
"She said \"Hi!\""