2013-11-26 8 views
1
#include <iostream> 
#include <vector> 
#include <string> 

using std::cout; using std::endl; 
using std::cin; using std::vector; using std::string; 

int main() 
{ 
    cout << "Input strings(end-of-file to exit):"<<endl; 
    vector<string> strings; 
    string x; 


    while (cin >> x) 
    { 
     strings.push_back(x); 
    } 

    typedef vector<string>::size_type vc_sz; 
    vc_sz size = strings.size(); 
    int same_string=0; 

    for (int i = 0; i < size; i++) 
    { 
     for (int j = i+1; j < size; j++) 
     { 
      if (strings[i] == strings[j]) 
       ++same_string; 
     } 
    } 

    cout << "Same string number:" << same_string << endl; 

    system("pause"); 
    return 0; 
} 

Это код простой программы, которая подсчитывает, сколько строк входов является избыточным. Кажется, что все работает нормально, за исключением того, что мне нужно ввести конец файла (ctr + z) два раза, чтобы закончить цикл и получить результат. Я не могу понять, почему это происходит.C++ count redundant string

+0

'в то время как (CIN >> х) 'может не делать то, что вы думаете, что он делает !! см. [здесь] (http://stackoverflow.com/search?q= [c% 2B% 2B] +% 22while +% 28cin +% 3E% 3E + x% 29% 22) ... –

+0

Возможный дубликат [while (cin >> x) и проблемы с окончанием файла] (http://stackoverflow.com/questions/1078218/while-cin-x-and-end-of-file-issues) –

+0

@ g-makulik это не случай, cin больше не используется после этого цикла – Slava

ответ

4

Казалось бы, что вы пытаетесь из за EOF характера в конце последовательности линии:

> This is my inputEOF 

Это заставит вас ввести другой EOF на самом деле конец потока. Если вы хотите, чтобы закончить поток с одним EOF, вам нужно нажать кнопку ввода первой:

> This is my inputENTER 
> EOF 
+1

Примечание. Ctrl-D на поддерживаемой ОС (Linux, OS X и т. Д.) Ведет себя одинаково. – WhozCraig

+0

Я запустил код в вопросе, и я нашел еще одну странную вещь: если вход такой: как ненавистьEOF hateEOF love EOF (в новой строке), результат: тот же номер строки: 1, НО это 2 !!! вы можете объяснить это пожалуйста ?? –

+1

@ T-D вы должны очистить состояние ошибки после маркера EOF ('std :: cin.clear()'). Вам также нужно будет игнорировать символ EOF, прежде чем пытаться перечитать его. Имейте в виду, что использование EOF таким образом (что означает «конец потока») должно фактически означать конец входного потока. Рассмотрение его как разрыва между записями не является хорошей практикой. –

0

Вы можете значительно упростить код, если вы используете std::set

int main() 
{ 
    cout << "Input strings(end-of-file to exit):"<<endl; 
    set<string> strings; 
    string x; 
    int same_string=0; 

    while (cin >> x) 
    { 
     if(!strings.insert(x).second) ++same_string; 
    } 

    cout << "Same string number:" << same_string << endl; 

    system("pause"); 
    return 0; 
}