2016-03-29 2 views
-2

Я пытаюсь получить пользовательский ввод имен для хранения в векторе. Каждый раз, когда я запускаю цикл for, он всегда принимает пустой ввод в переменной temp string в первый раз через цикл. Что я получаю, когда я запустить эту программу, что-то вроде:Пустой ввод строки в первый раз через цикл? (C++)

, 
Dylan, Bob 
Brown, Mark 
Rogers, Mr 

Спасибо за любую помощь

К сожалению первый пост = P Heres код:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <vector> 
#include <fstream> 
using namespace std; 

void getNames(vector<string> &n, int&); 
void displayNames(vector<string> &n, int&); 
void saveNames(vector<string> &n, int&); 
void readNames(vector<string> &n, int&); 
void sortNames(vector<string> &n, int&); 

int main(){ 

    vector<string> names; 
    int b = 0; 
    int choice; 

    while(choice != 5){ 
      cout << "1 - Enter a Character" << endl; 
      cout << "2 - Display List of Characters" << endl; 
      cout << "3 - Save List of Characters to File" << endl; 
      cout << "4 - Read List of Characters from File" << endl; 
      cout << "5 - Exit the program" << endl << endl; 

      cin >> choice; 

      switch(choice){ 
       case 1: getNames(names, b); break; 
       case 2: displayNames(names, b); break; 
       case 3: saveNames(names, b); break; 
       case 4: readNames(names, b); break; 
      } 
    } 
    return 0; 

} 

void getNames(vector<string> &n, int &b){ 

    string temp; 

    cout << "Enter Names. Press \'quit\' to stop." << endl; 

    for(b; temp != "quit"; b++){ 

     getline(cin, temp); 
     if(temp == "quit"){ 
      break; 
     }else{ 

     int space = temp.find(' ', 0); 

     string inPut = temp.substr((space+1), temp.length()); 
     inPut += ", "; 
     inPut += temp.substr(0, space); 

     n.push_back(inPut); 
     } 

    } 

} 

void displayNames(vector<string> &n, int &b){ 

    for(int c=0; c < b; c++){ 
     cout << n[c] << endl; 
    } 

} 

void saveNames(vector<string> &n, int &b){ 
    ofstream outFile; 
    outFile.open("names.txt", ios::app); 

    if(!outFile.fail()){ 

     for(int i=0; i < b; i++){ 

      outFile << n[i] << endl; 
     } 
     cout << "Names written to File" << endl; 

    }else{ 

     cout << "ERROR: File could not be opened" << endl; 
    } 
    outFile.close(); 
} 

void readNames(vector<string> &n, int&){ 
    string line; 
    ifstream inFile("names.txt"); 

    if(inFile.is_open()){ 
     while(getline(inFile, line)){ 
      cout << line << endl; 
     } 
     inFile.close(); 
    }else{ 
     cout << "Cannot open File" << endl; 
    } 

} 

void sortNames(vector<string> &n, int&){ 

    //for(int i=0; i < b; i++){} 

} 
+2

У вас есть ошибка в коде. –

+0

Просьба указать [минимальный полный проверяемый пример] (http://stackoverflow.com/help/mcve). Отправьте свой код. –

+0

Я запустил ваш код через мой отладчик, и проблема заключается в инструкции в строке 115. Запустите ваш отладчик и подтвердите, что это правильно. –

ответ

0

Фиксируя ваши фигурные скобки ваша функция getNames() работает для меня, как и ожидалось. Возможно, это недосмотр от публикации вашего кода, но вам не хватает фигурной скобки, чтобы закончить цикл for и функции для GetNames(). Составление и использование этого кода дает ожидаемый результат:

void getNames(vector<string> &n, int &b){ 

    string temp; 

    cout << "Enter Names. Press \'quit\' to stop." << endl; 

    for(b; temp != "quit"; b++){ 

     getline(cin, temp); 
     if(temp == "quit"){ 
      break; 
     }else{ 

      int space = temp.find(' ', 0); 

      string inPut = temp.substr((space+1), temp.length()); 
      inPut += ", "; 
      inPut += temp.substr(0, space); 

      cout << inPut << endl; //Testing string transformation before insertion. 

      n.push_back(inPut); 
     } 
    } 
} 

Passing имена: «Боб Дилан», «Джерри McQuire» и «Некоторые Гай» привел к выходу

Dylan, Bob 
McQuire, Jerry 
Guy, Some 

Это возможно что в коде есть ошибка где-то еще, если ваш первый элемент в векторе всегда пуст. Возможно, это ошибка в функциях saveNames() или readNames(). Но строки вводятся и преобразуются правильно здесь. Целесообразно опубликовать весь код, относящийся к вашему вопросу раньше времени.

Пожалуйста, включите это в верхней части GetNames():

cin.clear(); 
cin.ignore(10000, '\n'); 

Это очистит буфер Cin к новой линии, поэтому первоначальный выбор из основных() не получает положенное в к вектор неожиданно.

+0

Спасибо, да, у меня есть фигурные скобки, я просто не копировал его здесь правильно. Хорошо, я отредактирую свой пост с полным кодом –

+0

Когда вы распечатываете вектор, не печатайте элемент 0. Пустое значение поступает из инструкции cin в main(), когда пользователь выбирает вариант 1-5. – Winter

+0

Спасибо, это сработало! Почему значение из cin сохраняется в векторе? –

0

Почему вы с помощью для цикла? лучше использовать время цикла, как так:

void getNames(vector<string> &n, int &b) 
{ 
string temp; 
cout << "Enter Names. Press \'quit\' to stop." << endl; 
getline(cin, temp); 
while(temp != "quit") 
{ 
    int space = temp.find(' ', 0); 
    string inPut = temp.substr((space+1), temp.length()); 
    inPut += ", "; 
    inPut += temp.substr(0, space); 
    n.push_back(inPut); 
    getline(cin, temp); 
} 
...//the rest of your code... 
} 

Я не ответил на вопрос, извините ... первый вход прекращение характер вашего последнего CIN ... std::getline (string)

+0

Спасибо, что вы подразумеваете под «первым вводом является символ окончания ...»? –

+0

@ Даниэль Эванс, если вы не укажете разделительный символ для конца строки, предполагается, что «введите» (новая строка), так что возможно, что в последний раз, когда вы нажимаете enter на cin, это первый вход. –

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