2015-08-24 3 views
2

В проблеме я должен был взять n количество строк в качестве входных данных и подсчитать те, которые содержат заданную подстроку (без учета регистра).C++ Использование std :: getline вместо cin >>

Вот мой код:

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
#include<string> 
using namespace std; 
int main() 
{ 
    std::string str2 = "hello"; 
    std::string str3 = "HELLO"; 
    short int n,count=0,i; 
    cin>>n; 
    std::string str1[n]; 
    for(i=0;i<n;i++) 
    { 
     std::getline(std::cin,str1[i]); //here getline is taking only n-1 inputs 
     std::size_t found1=str1[i].find(str2); 
     std::size_t found2=str1[i].find(str3); 
     if(found1!=std::string::npos || found2!=std::string::npos) 
      count++; 
    } 
    cout<<count; 
    return 0; 
} 

Поскольку я не могу использовать CIN, как строка содержит пробелы или cin.getline(), как должны использовать тип строки вместо полукокса [].
Проблема с моим кодом: std :: getline() принимает только n-1 inputs.Cant выяснить почему?

+2

Возможно, последняя строка ввода не прекращается с новой строки. Различные стандартные реализации библиотеки обрабатывают это по-своему. Я помню проблему с компилятором IBM много лет назад, когда вы никогда не могли получить последнюю строку в файле, если она не закончилась новой строкой. – paddy

+0

Так много кода для того, что по сути является одним вызовом 'generate()'. Получать оплату персонажем? – Blindy

+0

Вы забыли про введенную клавишу Enter при вводе 'n' –

ответ

4

Первый getline после cin читает оставшуюся часть строки, которая, вероятно, пуста. Вот почему при чтении пользовательского ввода обычно лучше использовать getline и вход процесса с использованием кода.

После cin >> n входной поток расположен сразу после числа n. Вы можете использовать getline только для чтения новой строки, а затем выбросить ее в положение до начала следующей строки.

+0

вопроса dosnt требует новой строки после cin >> n. И я ничего не могу сделать, используя STL ?? – wrangler

+0

Получил, спасибо, что помогло. – wrangler

0

Этот код должен работать

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    int n = 0, count = 0; 
    cin >> n; 

    do { 
     string str; 
     getline(cin, str); 

     if (str.find("HELLO") != string::npos || str.find("hello") != string::npos) { 
      count++; 
     } 
    } while (n-- && n >= 0); 

    cout << count << endl; 
    return 0; 
} 
+0

Ваш код не устраняет проблему, о которой говорит старший ответ (и он оставляет другие неприятные проблемы - не проверяет успех 'cin >> n' и' getline') и вводит новые проблемы: он не справляется с ' 0' или отрицательный 'n', поскольку тест происходит после итерации цикла, а для' INT_MIN' он выполняет много итераций. –

Смежные вопросы