Что я делаю не так с cin.getline()?

Я относительно новичок и неопытен в программировании, поэтому приношу свои извинения, если у кого-то глаза кровоточат от моего кода.

Вопрос № 1: Мой код не работал, когда я пытался использовать cin.getline(), и я продолжаю получать сообщение об ошибке «Не удалось найти совпадение для std::istream::getline(char[30], int, const char[ 2])", но когда я попытался использовать getline(cin, varName), все сработало отлично. Я использовал cin.getline() перед использованием того же параметра, но раньше у меня никогда не было этой проблемы.

Вопрос №2: Просто интересно. Какой лучше? В моем случае лучше использовать cin.getline(...) или getline(cin, ___)? Или есть что-то еще лучше, чем любой из них? Я попытался прочитать Разница: cin.getline() и getline(cin, st) но я не уверен, что это хороший ответ.

Я включу обе копии рабочего и нерабочего кода. Пожалуйста, не обращайте внимания на имена, это всего лишь часть гораздо большего задания, которое меня попросили выполнить.

Не рабочий код:

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

class ElectricityBill
{
   private:
      char accountName[30];
      char address[50];
      tm dueDate;
      tm periodStartDate;
      tm periodEndDate;
   public:
      ElectricityBill();
      void print();
};

ElectricityBill::ElectricityBill()
{
   int dd, mm, yyyy;

   cout << "Input electricity bill data." << endl;

   cout << "Account name: ";
   cin.getline(accountName, 30, "\n");

   cout << "Address: ";
   cin.getline(address, 50, "\n");

   cout << "Start date: ";
   cin >> dd >> mm >> yyyy;
   periodStartDate.tm_mday = dd;
   periodStartDate.tm_mon  = mm;
   periodStartDate.tm_year = yyyy;

   cout << "End date: ";
   cin >> dd >> mm >> yyyy;
   periodEndDate.tm_mday = dd;
   periodEndDate.tm_mon  = mm;
   periodEndDate.tm_year = yyyy;

   cout << "Due date: ";
   cin >> dd >> mm >> yyyy;
   dueDate.tm_mday = dd;
   dueDate.tm_mon  = mm;
   dueDate.tm_year = yyyy;

   //next = NULL;
}
void ElectricityBill::print()
{
   cout << "Account Name: " << accountName << endl;
   cout << "Address     : " << address << endl;
   cout << "Start Date  : " << periodStartDate.tm_mday << "/" << periodStartDate.tm_mon << "/" << periodStartDate.tm_year << endl;
   cout << "End Date    : " << periodEndDate.tm_mday << "/" << periodEndDate.tm_mon << "/" << periodEndDate.tm_year << endl;
}

int main()
{
   ElectricityBill a;
   a.print();

   return 0;
}

Вот копия рабочего кода, когда я использую getline(cin, varName)..

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

class ElectricityBill
{
   private:
      string accountName;
      string address;
      tm dueDate;
      tm periodStartDate;
      tm periodEndDate;
   public:
      ElectricityBill();
      void print();
};

ElectricityBill::ElectricityBill()
{
   int dd, mm, yyyy;

   cout << "Input electricity bill data." << endl;

   cout << "Account name: ";
   getline(cin, accountName);

   cout << "Address: ";
   getline(cin, address);

   cout << "Start date: ";
   cin >> dd >> mm >> yyyy;
   periodStartDate.tm_mday = dd;
   periodStartDate.tm_mon  = mm;
   periodStartDate.tm_year = yyyy;

   cout << "End date: ";
   cin >> dd >> mm >> yyyy;
   periodEndDate.tm_mday = dd;
   periodEndDate.tm_mon  = mm;
   periodEndDate.tm_year = yyyy;

   cout << "Due date: ";
   cin >> dd >> mm >> yyyy;
   dueDate.tm_mday = dd;
   dueDate.tm_mon  = mm;
   dueDate.tm_year = yyyy;

   //next = NULL;
}
void ElectricityBill::print()
{
   cout << "Account Name: " << accountName << endl;
   cout << "Address     : " << address << endl;
   cout << "Start Date  : " << periodStartDate.tm_mday << "/" << periodStartDate.tm_mon << "/" << periodStartDate.tm_year << endl;
   cout << "End Date    : " << periodEndDate.tm_mday << "/" << periodEndDate.tm_mon << "/" << periodEndDate.tm_year << endl;
}

int main()
{
   ElectricityBill a;
   a.print();

   return 0;
}

Заранее спасибо!


person Vince    schedule 08.05.2013    source источник


Ответы (2)


Вопрос 1

cin.getline(accountName, 30, '\n');

Третий аргумент getline — это символ, а не строка. Также значение по умолчанию '\n' для приведенного выше кода точно такое же, как

cin.getline(accountName, 30);

Вопрос 2

std::string превосходит массив символов для большинства целей. Например, с std::string у вас нет верхнего предела размера строки.

person john    schedule 08.05.2013
comment
Спасибо! Я должен был знать лучше. Теперь я чувствую, что хочу заколоть себя за такую ​​​​ошибку. - person Vince; 08.05.2013
comment
версия массива символов на самом деле является исходной версией, затем я наткнулся на getline при чтении учебника C++ Стэнли Липпмана. - person Vince; 08.05.2013
comment
Вам не нужно этого делать, все делают ошибки, и вы, возможно, ничем не отличаетесь. В свое время я бы поставил симиколон более или менее и, несмотря на то, что смотрел на него, не мог его видеть. :) - person LiaqatG; 08.05.2013
comment
getline() превосходит cin.getline()? Ясно... Я выберу это как ответ завтра, если кто-то не придумал лучший ответ :) Должен сесть на автобус. - person Vince; 08.05.2013

Я думаю, тебе стоит попробовать это

cin.getline(accountName, 30, '\n');

вместо этого.

cin.getline(accountName, 30, "\n");

'\n' - это символ, а не строка.

person LiaqatG    schedule 08.05.2013
comment
Ага. Это ошибка, которую я сделал. Спасибо! - person Vince; 08.05.2013
comment
Пожалуйста, Винс. Пожалуйста, отметьте как ответ, если можно. Спасибо. - person LiaqatG; 08.05.2013