c ++ cin.getline () не работает - PullRequest
3 голосов
/ 06 марта 2011

моя проблема в том, что моя программа не читает значения, которые я ввожу с клавиатуры, читает только 1, 2 и последнее. Я пытался с cin.ignore (); и другие решения, но не работает.

Это ввод:

Insurance 1
Model: mazda

serial number: 60

Price: 9999

Contract number: 76Z

Contract money: 12

// после всех символов был \ n ввод.

Это вывод:

Insurance 1
Model: mazda

serial number: 60

Price: 0

Contract number: 

Contract money: 12

Я пишу здесь только функцию, а не всю программу:

struct tseg{
  char model[15]; //nombre del modelo
  char serialnumber[15]; //número de serie del coche
  double price; //precio de compra del coche
  char contractnumber[15]; //numero del seguro
  double contractmoney; //importe del contrato
};

bool registrarSeguro(tconces *a, int p, int total){ //p is the position!!!

      a[p].contrato = new tseg[a[p].numSegurosActuales];

      cout << "Enter model: " <<endl;
        cin.ignore();
      cin.getline(a[p].contrato[a[p].numSegurosActuales].model, 15);
      cout << "Enter serial number: " <<endl;
        cin.ignore();
      cin.getline(a[p].contrato[a[p].numSegurosActuales].serialnumber, 15);
      cout << "Enter price: " <<endl;
        cin.ignore();
      cin >> a[p].contrato[a[p].numSegurosActuales].price;
      cout << "Enter contract number: " <<endl;
        cin.ignore();
      cin.getline(a[p].contrato[a[p].numSegurosActuales].numContrato, 15);
      cout << "Enter contract number: " <<endl;
      cin >> a[p].contrato[a[p].numSegurosActuales].impContrato;

      a[p].numSegurosActuales++;
      sw = true;

 return (sw);
}

Ответы [ 2 ]

1 голос
/ 06 марта 2011

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

#include <util>
#include <cstring>

// ...

std::string input;
std::getline( cin, input );

// +1 char for end of string
std::strncpy( a[p].contrato[a[p].numSegurosActuales].model, input.c_str(), 14 );

Таким образом, ваш ввод всегда будет происходить без сбоев.Нет ожидающих символов, нет ошибок потока, нет проблем вообще.Недостатком является то, что вам придется конвертировать числа, если они вам нужны, но вы уже это делаете.¡Buena suerte!

1 голос
/ 06 марта 2011

Есть несколько проблем с кодом. Во-первых, поля, которые вы показываете для ввода, Contrato, не являются теми, что в структуре. Какие поля вы используете при отображении значений?

Другая вещь касается cin.ignore (), которая по умолчанию игнорирует следующий символ из ввода. Это может сработать для пропуска конца строки, если вы уверены, что на этой позиции вы точно . Если может быть что-то еще, например, пробел или два, вы можете использовать cin.ignore (1000, '\ n'), который пропускает до 1000 символов при поиске конца строки.

Если вы используете getline (), он читает всю строку, включая маркер конца, поэтому вам не следует использовать ignore ().

...