2014-10-16 1 views
2

Я могу ввести ввод для вызова getline (cin, input, '\ n'), но он никогда не заканчивается. Я могу просто продолжать вводить данные. Я пробовал без цикла for, и он принимает вход для getline(), а затем печатает его. Поэтому я предполагаю, что это проблема с циклом for. У меня нет ошибок компилятора.Для Loop после getline() не выполняется

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

int main() 
{ 
    unsigned int i = 0; 
    int cat_appearances = 0; 
    string l; 
    cout << "Please enter a line of text: " << endl; 
    getline(cin, l, '\n'); 

    for (i = l.find("cat", 0); i != string::npos; i = l.find("cat", i)) { 
    cat_appearances++; 
    //move past the last discovered instance to 
    //avoid finding same string again 
    i++; 
    } 

    cout << "The word cat appears " << cat_appearances 
     << " in the string " << '"' << l << '"'; 
} 
+2

Простая отладка: (1) напечатать строку в 'L' перед тем петля; (2) напечатайте значение 'i', или значение' i' получит: 'cout << l.find (« cat », 0) <<" \ n ";' –

ответ

4

Включите предупреждения о компиляторе!

warning: comparison is always true due to limited range of data type [-Wtype-limits] 
     for(i = l.find("cat", 0); i != string::npos; i = l.find("cat",i)) 
            ^

Тип std::string::npos определяется реализацией, компилятор, вероятно, определяет его как std::size_t, и на вашей платформе sizeof(unsigned int) < sizeof(std::size_t).

std::string::npos определяется как std::string::size_type(-1), т.е. std::numeric_limits<size_t>::max(), значение, которое на вашей платформе не может быть представлена ​​unsigned int.

Изменение i в

std::string::size_type i = 0; 

(На стороне отметить, что это освежающий, что вы включили полный, компилируемый пример!)

+0

Спасибо за объяснение. Это решило мою проблему. – Webtm