stringstream은 아래의 글을 쓰다가 더 좋은 답안이 있어서 정리하게 되었다.
프로그래머스 코딩테스트 입문 난이도 - OX퀴즈 (tistory.com)
일단 헤더파일은
#include <sstream> // stringstream 사용하기 위해 추가
위에 ssstream을 추가하면 된다.
이번엔 stringstream을 사용해서 위의 OX퀴즈를 풀어보았다.
stringstream ss;
vector<string> vStr, vResult;
vStr.push_back("1 + 2 = 3");
vStr.push_back("2+7=2");
일단 vStr에 문제를 넣어봤다.
첫번째 문제는 코딩테스트와 같은 형태로 넣어봤고,
두번째 문제는 빈칸이 없을땐 어떻게 되나 싶어서 넣어봤다.
일단 stringstream은
string기준으로 한글자 한글자를 처리하는? 그런 기능을 가지고 있는 것 같았다.
예를 들면,
int nA, nB, nResult, nRealResult = 0;
char strOP, strOP2;
for (auto i : vStr)
{
ss.str(i);
ss >> nA;
ss >> strOP;
ss >> nB;
ss >> strOP2;
ss >> nResult;
switch (strOP)
{
case '+':
nRealResult = nA + nB;
break;
case '-':
nRealResult = nA - nB;
break;
}
if (nRealResult == nResult)
cout << i << " result = " << "O" << endl;
else
cout << i << " result = " << "X" << endl;
ss.clear();
}
이런식으로 코드를 짜면 위의 두 문제에 대해 정상적인 값을 가져올 수 있었다.
현재 첫 번째 string은 "1 + 2 = 3" 이고,
ss.str(i);
ss >> nA;
ss >> strOP;
ss >> nB;
ss >> strOP2;
ss >> nResult;
ss.str()을 통해 stringstream에 "1 + 2 = 3" 값을 넣어준 뒤,
">>" 를 통해 int형인 nA에 첫번째 문자인 "1"을 넣어줄 수 있다.
그 다음에는 부호인 "+"를 넣어줘야 하기 때문에
char형인 strOP를 ">>" 해주면 정상적으로 "+" 값이 들어간다.
이런 식으로 나머지 값도 다 넣어주면
nA = 1
strOP = "+"
nB = 2
strOP2 = "="
nResult = 3
의 값이 들어있게 된다.
내가 두번째 문항인 띄어쓰기가 없는
"2+7=2"를 넣은 이유는,
처음엔 char strOP, strOP2가 아닌
string strOP, strOP2로 해봤는데,
nA = 2
strOP = "+7=2"
이렇게 들어가는 현상을 확인했다.
그래서 그냥 내 개인적인 추측으로
1바이트인 char로 바꿔주면 정상적으로 되지 않을까 싶어서 바꿔봤는데,
잘 동작했다.
string 문자"열"이기 때문에 이런 현상이 발생하는 것 같다.
결론은
stringstream은 string으로 된 데이터가 있을 때,
만약 같은 형태의 구분자로 값들이 구분될 경우에는
순차적으로 원하는 타입의 변수에 값을 알아서 변경시켜 넣어주는 것 같다.
다만 구분자가 들쑥날쑥 하거나,
없을 경우에는 데이터 타입을 고려하여 사용해야 할 것 같다.
여튼 좋은거 하나 또 배워간다.
델파이에는 비슷한 걸로 stringList가 있는데, 유용하게 많이 사용했기 때문에
이것도 자주 사용할 수 있을 것 같다.