Software Workshop

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!\""