2010-03-10 6 views
0

모음을 집계하는 함수를 작성했습니다. 하천의 끝 부분에 모음이 있으면 두 번 계산됩니다. 왜? 마지막 읽기 때문에 데이터의 부족으로 실패했을 때 in이 거짓으로 평가하기 때문에예상 한대로 istream의 끝이 검색되지 않습니다.

#include <iostream> 
#include <string> 
#include <map> 
using namespace std; 

void countChars(istream& in, string theChars, ostream& out) { 
    map<char, int> charMap; 
    map<char, int>::iterator mapIt; 

    for (string::iterator i = theChars.begin(); i != theChars.end(); ++i) { 
    charMap[*i] = 0; 
    } 
    while (in) { 
    char c; 
    in >> c; 
    c = tolower(c); 
    if (charMap.count(c)) 
     ++charMap[c]; 
    } 
    for (mapIt = charMap.begin(); mapIt != charMap.end(); ++mapIt) { 
    out << (*mapIt).first << ":" << (*mapIt).second << endl; 
    } 
} 

int main(int argc, char **argv) { 
    std::string s = "aeiou"; 
    countChars(std::cin, s, std::cout); 
} 
+2

시도 '동안 (>>에서 C)'대신''(에서) 동안? – Bill

답변

4

다음 읽기 때문에 데이터의 부족으로 실패하지 때문이다. "앞을 내다 보지"않는다. 스트림이 이전에 읽으 려 시도했으나 실패한 경우에만 스트림이 완료되었음을 알 수있다.

그래서 다음과 같은 상황이 발생합니다

  • 마지막 문자를 읽고
  • in이 참으로 평가 처리되므로 루프는
  • 가 다시 읽으려고 반복,하지만 더 많은 데이터 때문에,이 없다 c는 수정되지 않음
  • 정의되지 않은 (비록 놀랍지는 않지만) 동작으로 인해 c은 루프 마지막 실행에 있던 값을 포함하게됩니다.
  • 따라서 다시 같은 숯.

를 작성해야 :

char c; 
while (in >> c) { etc } 
+1

+1, 훨씬 더 철저히! – Bill

관련 문제