Выход выходит неправильно

Сейчас я учу себя C / C ++, и я получил упражнение (из книги, которую читаю), чтобы написать программу, которая могла бы сделать такой вывод:

Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: Fleming, Flip

Использование структур. Но мой вывод получается так:

Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: ,

Вот код Он довольно короткий и простой, поэтому читать его не должно быть сложно 🙂

#include <iostream>
#include <cstring>

using namespace std;

struct Person {
char* firstName;
char* lastName;
};

char* getName(void);

int main() {
Person* ps = new Person;
cout << "Enter your first name: ";
char* name;
name = getName();
ps->firstName = name;
cout << "Enter your last name: ";
char* lastname;
lastname = getName();
ps->lastName = lastname;
cout << "Here's the information in a single string: "<< ps->lastName << ", " << ps->firstName;
delete ps;
delete name;
delete lastname;

return 0;
}

char* getName() {
char temp[100];
cin >> temp;
cin.getline(temp, 100);
char* pn = new char[strlen(temp) + 1];
strcpy(pn, temp);

return pn;
}

1

Решение

Во-первых, непосредственная проблема заключается в том, что вы дважды читаете std::cin: сначала с operator>>, а затем с getline, Выберите один или другой.

Но давайте немного упростим ваш код. Есть просто слишком много источников ошибок. Указатели хитры, потому что они могут указывать на неправильную вещь, или вы можете забыть удалить объекты или удалить их дважды. Символьные массивы в стиле C как строки плохие, потому что они не являются строками и не ведут себя как строки.

Итак, давайте используем строковый класс стандартной библиотеки:

#include <iostream>
#include <string>

struct Person {
std::string firstName;
std::string lastName;
};

std::string getName(void);

int main() {
Person ps;
cout << "Enter your first name: ";
std::string name = getName();
ps.firstName = name;
cout << "Enter your last name: ";
std::string lastname = getName();
ps.lastName = lastname;
cout << "Here's the information in a single string: "<< ps.lastName << ", " << ps.firstName;
}

std::string getName() {
std::string temp;
std::getline(cin, temp);
return temp;
}

Это довольно простая, почти механическая замена, в основном просто замена char* от std::stringи удаление битов, которые больше не нужны.

Конечно, как указано в комментарии, я пропустил все формы проверки ошибок, что определенно должна делать настоящая программа.

2

Другие решения

Во-первых, есть нет такой вещи как C / C ++. Вы смешиваете их, что неправильно. Так как вы используете заголовки C ++ /new/usingЯ предполагаю, что вы хотите C ++, вот как вы исправляете свой код:

  • заменить все char* а также char[] с std::string
  • избавиться от динамического распределения

Итак, некоторые изменения будут:

struct Person {
std::string firstName;
std::string lastName;
};

или же

Person ps;
5

Ты используешь:

cin >> temp;
cin.getline(temp, 100);

Вы, вероятно, перезаписываете то, что у вас уже есть, пустой строкой в ​​конце строки.

Используйте только один из них.

Если вы будете придерживаться с помощью cin >> вы можете рассмотреть возможность установки width() предотвратить переполнение буфера.

3

Нет-нет-нет, слишком сложно. Используйте настоящие идиомы С ++. Программа может быть такой простой:

#include <string>
#include <iostream>

int main()
{
std::string firstName, lastName;

if (!(std::cout << "Your first name: "  &&
std::getline(std::cin, firstName) &&
std::cout << "Your last name: "   &&
std::getline(std::cin, lastName)     ))
{
std::cerr << "Error: unexpected end of input!\n";
return 0;
}

std::cout << "You are " << firstName << " " << lastName << ".\n";
}

В качестве вариации на тему, вы можете поставить каждый getline в цикле, пока пользователь не введет непустую строку:

std::cout >> "Your first name: ";
for ( ; ; )
{
if (!(std::getline(std::cin, firstName))
{
std::cerr << "Error: unexpected end of input.\n";
return 0;
}
if (!firstName.empty())
{
break;
}
std::cout << "Sorry, please repeat - your first name: ";
}
2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector