더북(TheBook)

while 루프는 일어날 익셉션을 잡는 try 블록 안에 있다. catch 블록은 익셉션 객체의 what() 멤버가 반환한 문자열을 표준 에러 스트림에 쓴다. 모든 일은 while 무한 루프에서 처리되고, while 루프는 문자열이 모두 비워지면 종료된다. 빈 문자열이 아닌 입력 문자열의 공백은 remove() 알고리즘을 사용해 제거한다. remove()는 원소를 제거하지 않는다. remove()는 실제로 원소를 제거할 수 없다. remove()는 제거할 원소들을 덮어쓰면서 원소들을 이동시킬 뿐이다. exp 문자열에 남겨진 잉여 원소를 제거하려면 제거할 원소의 범위를 반복자로 지정해서 erase() 멤버를 호출해야 한다. erase()의 첫 번째 인수는 remove()가 반환한 반복자로 remove()를 수행한 문자열에서 마지막으로 유효한 문자의 다음 문자를 가리킨다. 두 번째 반복자는 원본 상태로 있는 문자열의 끝 반복자로 지정한다. 두 반복자가 가리키는 범위에 있는 원소들은 제거된다.

각 피연산자는 string 헤더에 정의되어 있는 stod() 함수를 호출해서 부동소수점 값으로 가져온다. stod() 함수는 첫 번째 인수 string에서 가져온 문자 순차열을 double 타입 값으로 변환한다. stod() 함수는 문자열의 첫 번째 문자에서 시작해서 유효한 부동소수점 값으로 보이는 문자 순차열을 최대 길이로 가져온다. stod() 함수에서 두 번째 인수는 정수 변수를 가리키는 포인터로 문자열에서 숫자가 아닌 부분의 첫 번째 문자에 대한 인덱스를 저장한다. string 헤더에는 float 값을 반환하는 stof(), long double 값을 반환하는 stold()도 정의되어 있다.

모든 연산자는 피연산자 두 개가 필요하므로 유효한 입력 문자열은 ‘피연산자 연산자 피연산자 연산자 피연산자…’ 형태여야 한다. 즉, 순차열의 처음과 마지막은 피연산자여야 하고 각 피연산자 쌍 중간에는 연산자가 있어야 한다. 입력한 식이 유효하려면 항상 피연산자로 시작해야 하고 첫 번째 피연산자는 중첩된 while 무한 루프를 실행해 입력을 분석하기 전에 추출된다. 루프 안에서는 입력 문자열에 있는 연산자를 operators 스택에 넣는다. 이어서 두 번째 피연산자를 exp에서 추출하고 문자열의 끝에 도달했는지 확인한다. 여기서 사용한 stod()의 첫 번째 인수는 expindex로 지정한 위치에서 시작하는 서브스트링으로 operators 스택에 넣은 연산자 다음에 오는 문자열에 해당한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.