2013-03-11 2 views
1

Я написал этот код для чтения N строк из ввода в консоль и поместил его в массив строк, но это чтение N-1 строк Любые предложения?getline() не заполняет весь массив строк

#include<iostream> 
#include<stdio.h> 
#include<string> 
using namespace std; 

int main() 
{ 
int test; 
cin>>test; 
string *cases=new string[test]; 
for(int i=0;i<test;i++) 
{ 
    getline(cin,cases[i],'\n'); 
} 

for(int i=0;i<test;i++) 
{ 
    cout<<cases[i]<<endl; 
} 

system("pause"); 
return 0; 
} 
+0

дать образец вывода, объясняя, что не так – uba

+1

Это комбинация '>>' и 'getline'. Остальная часть строки (на самом деле, вероятно, ничего не содержит) после ввода 'int' для размера считывается в' cases [0] '. Я всегда считаю, что проще всего не смешивать использование '>>' и 'getline'. – BoBTFish

ответ

3

Допустим, ваш вклад, как это:

2\n 
line 0\n 
line 1\n 

Затем после cin>>test, есть пустая строка в верхней части:

\n 
line 0\n 
line 1\n 

Использование >> только считывает бит это (т. е. int), затем оставляет что-то еще на потоке (в данном случае только \n, но подумайте об этом, re могут быть всевозможными вещами на линии). getline читает все до \nзатем удаляет \n из потока. Таким образом, после первого getline, оставшийся вход:

line 0\n 
line 1\n 

и cases[0] содержит "" (т.е. пустая строка).

Затем после следующего getline:

remaining input: 
line 1\n 

и

cases[0]: "" 
cases[1]: "line 0" 

Затем цикл останавливается, потому что он прочитал 2 строки. Вот что случилось. Фиксирование это другое дело. Я предпочитаю просто избегать смешивания >> и getline. Но вы можете сделать что-то, чтобы очистить этот трейлинг \n от потока.

EDIT: Вы также можете сделать так, чтобы читать на std::vector (что документация может быть немного техническими - найти учебники) и пороки using namespace std;

я соединял один из способов ее фиксации. Примечание stoi - только C++ 11. Если у вас этого нет, вы можете попробовать stringstream с >> или atoi.

#include <iostream> 
#include <vector> 
#include <string> 
int main() 
{ 
    int inLines = 0; 
    //std::cin >> inLines; 
    std::string countLine; 
    std::getline(std::cin, countLine); 
    try 
    { 
     inLines = std::stoi(countLine); 
    } 
    catch (...) 
    { 
     std::cout << "First line must be an integer\n"; 
     return 1; 
    } 
    std::vector<std::string> lines(inLines); 

    for (int i = 0; i < inLines; ++i) 
    { 
     std::getline(std::cin, lines[i]); 
    } 

    for (auto & s : lines) 
    { 
     std::cout << s << '\n'; 
    } 
    return 0; 
} 
+1

Спасибо за объяснение проблемы, я исправил ее с помощью scanf ("% d \ n", &test); Есть ли лучший способ? – Nader

+0

Я добавил один из возможных способов сделать это. Использование 'scanf' исправляет эту конкретную проблему, но все же в основном означает, что вы смешиваете свои методы ввода, что может вызвать проблемы. – BoBTFish

+0

Еще раз спасибо, что помогло мне много _ _ ​​^ – Nader

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