2013-03-03 4 views
2

C++을 사용하여 간단한 명령 구문 분석기를 만들고 있는데, istream >>을 사용하여 숫자 또는 문자를 입력하는지 확인하려고합니다.C++ : istringstream

입력 :

a = 10 
b = a 

parser.cpp : varRight이 비어있는 경우

목표는
string inputLine, varLeft, equal, varRight; 
double varValue 
// please see update below 
while(getline(cin, inputLine)){ 
    istringstream stringSplitter(inputLine); 
    stringSplitter >> varLeft >> equal; 

    if(!(stringSplitter >> varValue)){ 
     stringSplitter >> varRight; 
    } 
}  

나중에 코드에서, 나는, 입력 라인이 double 문자라고 가정 그렇지 않으면 변수를 나타내는 문자열입니다. 숫자로 시작하는 혼합 입력과 관련된 논리적 오류가있을 수 있음을 이해하지만 모든 입력이 올바르게 형식화되어 있다고 가정합니다. 입력의 두 번째 줄에있는 a이 왜 버려 집니까? 당신은 어떤 고치기를 제안합니까?

업데이트

문제는 while 루프 문으로하지 않습니다, 그것은 동안 코드 블록의 끝 부분에있는 경우 문이다.

실제 코드에서 루프는 실제로는 while 루프가 아닙니다. 내가 문자열 명령을 들고 벡터 개체를 사용하고 반복기를 사용하여 벡터를 통해가는 for 루프를 사용하여 iterating. 그러나 댓글 작성자를 기쁘게하기 위해 위에 수정했습니다.

답변

3

입력 기능이 실패하면 스트림은 실패 상태를 지울 때까지 더 이상 추출을 허용하지 않습니다. 당신이 varValue의 입력이 실패했음을 확인 한 후에 std::basic_ios::clear으로, 그렇게해야합니다 :

if(!(stringSplitter >> varValue)){ 
    stringSplitter.clear(); 
    stringSplitter >> varRight; 
} 

난 당신이 희망이 아니에요 (순간 /* not end of input */을하고있는 방법을 모른다 !) eof()을 확인하지만, 당신이 할 것을 권장하는 것은 :

while (getline(cin, inputLine)) { 
    // ... 
} 

이 라인 입력이 루프에 다이빙을하기 전에 성공적으로 완료되었는지 확인합니다.

+0

완벽하게 작동했습니다. while 루프에 대해서는 위의 업데이트를 참조하십시오. 당신의 도움을 주셔서 대단히 감사합니다. – naxchange

+0

하지만 그는'stringSplitter >> varRight;'가 성공했는지 어떻게 확인하나요? – 0x499602D2

관련 문제