Top.Mail.Ru
Ответы

Помогите пожалуйста с приложением на с++. Почему то при выводе информации в консоль не выводит первые символы. Срочно

мой код:

#include <iostream>
#include <string>
#include <vector>

class ToDoList {
public:
std::vector<std::string> titles;
std::vector<std::string> priorities;
std::vector <std::string> descriptions;
std::vector <std::string> dates_and_times;

void addCase(std::string& title, std::string& priority, std::string& description, std::string& date_and_time) {
titles.push_back(title);
priorities.push_back(priority);
descriptions.push_back(description);
dates_and_times.push_back(date_and_time);
}

void printInfo() {
for (int i = 0; i < titles.size(); ++i) {
std::cout << "\nИндекс: " << i << " \n| Название: " << titles[i]
<< " \n| Приоритет: " << priorities[i]
<< " \n| Описание: " << descriptions[i]
<< " \n| Дата и время: " << dates_and_times[i] << std::endl;
}
}
};

int main() {
system("chcp 1251");
system("cls");

ToDoList todolist;
int choice;

while (true) {

std::cout << "\n- 1. Добавить";
std::cout << "\n- 2. Отображение списка";
std::cout << "\n\nВведите цифру: "; std::cin >> choice;
if (choice == 1) {
std::string title, priority, description, date_and_time;

std::cout << "\n| Название: ";
std::cin.ignore();
std::getline(std::cin, title);

std::cout << "| Приоритет: ";
std::cin.ignore();
std::getline(std::cin, priority);

std::cout << "| Описание: ";
std::cin.ignore();
std::getline(std::cin, description);

std::cout << "| Дата и время(YYYY-MM-DD HH:MM): ";
std::cin.ignore();
std::getline(std::cin, date_and_time);

todolist.addCase(title, priority, description, date_and_time);
}
else if (choice == 2) {
todolist.printInfo();
}
}
}

а вот что выводит в консоль:

- 1. Добавить
- 2. Отображение списка

Введите цифру: 1

| Название: t t
| Приоритет: t t
| Описание: t t
| Дата и время(YYYY-MM-DD HH:MM): 2-2-2 2:2

- 1. Добавить
- 2. Отображение списка

Введите цифру: 2

Индекс: 0
| Название: t t
| Приоритет: t
| Описание: t
| Дата и время: -2-2 2:2

не понимаю куда пропадают первые символы при отображении списка в консоль

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Знаток
3мес

Проблема в вашем коде связана с неправильным использованием std::cin.ignore(). В текущей реализации вы вызываете std::cin.ignore() перед каждым вводом строки, что приводит к пропуску первого символа каждой строки.

std::cin.ignore() используется для очистки буфера ввода, но в вашем случае он вызывается слишком часто. Вам нужно вызвать std::cin.ignore() только один раз после ввода числа (std::cin >> choice;), чтобы очистить буфер от оставшегося символа новой строки.

Вот исправленный код:

cpp
Copy
#include <iostream>
#include <string>
#include <vector>

class ToDoList {
public:
std::vector<std::string> titles;
std::vector<std::string> priorities;
std::vector <std::string> descriptions;
std::vector <std::string> dates_and_times;

void addCase(std::string& title, std::string& priority, std::string& description, std::string& date_and_time) {
titles.push_back(title);
priorities.push_back(priority);
descriptions.push_back(description);
dates_and_times.push_back(date_and_time);
}

void printInfo() {
for (int i = 0; i < titles.size(); ++i) {
std::cout << "\nИндекс: " << i << " \n| Название: " << titles[i]
<< " \n| Приоритет: " << priorities[i]
<< " \n| Описание: " << descriptions[i]
<< " \n| Дата и время: " << dates_and_times[i] << std::endl;
}
}
};

int main() {
system("chcp 1251");
system("cls");

ToDoList todolist;
int choice;

while (true) {

std::cout << "\n- 1. Добавить";
std::cout << "\n- 2. Отображение списка";
std::cout << "\n\nВведите цифру: "; std::cin >> choice;
std::cin.ignore(); // Очищаем буфер ввода после ввода числа

if (choice == 1) {
std::string title, priority, description, date_and_time;

std::cout << "\n| Название: ";
std::getline(std::cin, title);

std::cout << "| Приоритет: ";
std::getline(std::cin, priority);

std::cout << "| Описание: ";
std::getline(std::cin, description);

std::cout << "| Дата и время(YYYY-MM-DD HH:MM): ";
std::getline(std::cin, date_and_time);

todolist.addCase(title, priority, description, date_and_time);
}
else if (choice == 2) {
todolist.printInfo();
}
}
}
Теперь std::cin.ignore() вызывается только один раз после ввода числа choice, что позволяет корректно очистить буфер ввода и избежать пропуска первых символов при вводе строк.

Аватар пользователя
Гений
3мес

У cin.ignore() есть одна запутывающая особенность (связанная с особенность cin, который не имеет окончания). Если из потока cin в данный момент нечего извлекать, программа остановится и подождет пока вы что ни будь не введете. А вам кажется как будто символы удаляются в будущем или авансом)
Если же попробовать провернуть тоже самое но с пустым файлом (который как раз имеет окончание), то программа не остановится, а на файловый поток будет поставлена метка ошибки.

Аватар пользователя
Мыслитель
3мес

#include <iostream>
#include <string>
#include <vector>

class ToDoList {
public:
std::vector<std::string> titles;
std::vector<std::string> priorities;
std::vector<std::string> descriptions;
std::vector<std::string> dates_and_times;

void addCase(std::string& title, std::string& priority, std::string& description, std::string& date_and_time) {
titles.push_back(title);
priorities.push_back(priority);
descriptions.push_back(description);
dates_and_times.push_back(date_and_time);
}

void printInfo() {
for (int i = 0; i < titles.size(); ++i) {
std::cout
<< "\nИндекс: " << i
<< " \n| Название: " << titles[i]
<< " \n| Приоритет: " << priorities[i]
<< " \n| Описание: " << descriptions[i]
<< " \n| Дата и время: " << dates_and_times[i]
<< std::endl;
}
}
};

int main() {
system("chcp 1251 > nul"); // <button class="citation-flag" data-index="6">
system("cls");

ToDoList todolist;
int choice;

while (true) {
std::cout
<< "\n- 1. Добавить"
<< "\n- 2. Отображение списка"
<< "\n\nВведите цифру: ";

std::cin >> choice;
std::cin.ignore(); // Очистка буфера после ввода числа <button class="citation-flag" data-index="6">

if (choice == 1) {
std::string title, priority, description, date_and_time;

std::cout << "\n| Название: ";
std::getline(std::cin, title);

std::cout << "| Приоритет: ";
std::getline(std::cin, priority);

std::cout << "| Описание: ";
std::getline(std::cin, description);

std::cout << "| Дата и время(YYYY-MM-DD HH:MM): ";
std::getline(std::cin, date_and_time);

todolist.addCase(title, priority, description, date_and_time);
}
else if (choice == 2) {
todolist.printInfo();
}
}
}

Аватар пользователя
Ученик
3мес

Проблема в том, что `std::cin.ignore()` перед каждым `std::getline()` пропускает первый символ входной строки. Уберите лишние `std::cin.ignore()` после первого ввода `std::getline()`, чтобы не пропускать ввод данных:

```cpp
std::cout << "\n| Название: ";
std::cin.ignore();
std::getline(std::cin, title);

std::cout << "| Приоритет: ";
std::getline(std::cin, priority);

std::cout << "| Описание: ";
std::getline(std::cin, description);

std::cout << "| Дата и время(YYYY-MM-DD HH:MM): ";
std::getline(std::cin, date_and_time);
```

Попробуйте такой код, и ввод данных должен работать корректно.