cin и cin.get() ломают программу

423
23 января 2017, 19:22

Путем проб и ошибок я пришел тому что cin как то не закрывает поток или что еще и сразу заполняет "\n" следующее поле динамического массива. Подскажите правильно ли я думаю и как например мне сделать считывание перед switch чтобы поле с фамилией можно было заполнить. 42 -44 строчка там я еще комментарии написал.Спасибо

#include<iostream>
#include<windows.h> 
using namespace std;
class Sponsor
{
public:
    char name[32];
    char surname[32];
    double sum;
Sponsor (){
    cout << "cr"<<endl;
}
~Sponsor (){
    cout << "del"<<endl;
}
};
Sponsor* AddStruct(Sponsor* Obj, const int amount);
void setData(Sponsor* Obj, const int amount);
void showData(const Sponsor* Obj, const int amount);
void menu(const int amount);
void editData(Sponsor* Obj){
    cout << "Введите порядковый номер записи для редактирования" << endl;
    int amount, YesOrNot;
    cin >> amount;
    cout << "Редактирование записи №" << amount << endl;
    setData(Obj, amount - 1);
    cout << "Запись отредактирована" << endl;
}
void loadData(const Sponsor* Obj, const int amount);
int main()
{
    setlocale(LC_ALL, "rus");
    Sponsor* OurSponsors = 0;
    int sponsorAmount = 0;
    int YesOrNot = 0; //  продолжить или остановить ввод данных
    int rule = 9; //если прописываю здесь например 1 то срабатывает все нормально программа просит ввести имя а потом фамилию
    while (rule != 0){
    cin >> rule; // cin.get() тот же эффект программа пропускает воод фамилии а сразу переходит к имени
    switch (rule){
    case 1://add
        {   
    do
    {
        OurSponsors = AddStruct(OurSponsors, sponsorAmount);
        setData(OurSponsors, sponsorAmount);
        sponsorAmount++;
        cout << "Продолжить ввод данных (1 - да, 0 - нет): ";
        cin >> YesOrNot;
        cin.get();
    } while (YesOrNot != 0);


    break;
        }   

    case 2://edit
          { 
            editData(OurSponsors);
        break;
          }
    case 3://показать
          { 
            showData(OurSponsors, sponsorAmount);
        break;
          }
    case  4: //загрузить
          { 
        break;
          }
    }
}
    delete[] OurSponsors;
    return 0;
}
Sponsor* AddStruct(Sponsor* Obj, const int amount)
{
    if (amount == 0)
    {       
        Obj = new Sponsor[1]; // выделение памяти для первой структуры
    }
    else
    {
        Sponsor* tempObj = new Sponsor[amount + 1];
        for (int i = 0; i < amount; i++)
        {
            tempObj[i] = Obj[i]; // копируем во временный объект
        }
        delete [] Obj;
        Obj = tempObj;      
    }           
    return Obj;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void setData(Sponsor* Obj, const int amount)
{
        cout << "Фамилия: ";
        cin.getline(Obj[amount].surname, 32);
        cout << "Имя: ";
        cin.getline(Obj[amount].name, 32);
        cout << "Сумма пожертвования: ";
        cin >> Obj[amount].sum;
        cin.get(); 
        cout << endl;   
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void showData(const Sponsor* Obj, const int amount)
{
    system("cls");
    cout << "№  " << "Фамилия\t" << "Имя\t" << "Сумма\t" << endl;
    cout << "========================================" << endl;
    for (int i = 0; i < amount; i++)
    {       
        cout << i + 1 << "  " << Obj[i].surname << '\t' << Obj[i].name << '\t' << Obj[i].sum << endl;
    }
    system("pause");
}

Answer 1

[Тоскливо и устало] после ввода числа с помощью cin >> N в буфере ввода остаются несчитанные символы (буде такие есть) до конца строки пусть сам конец строки...

Если после этого вы читаете что-то не числовое, грубо говоря, вы считываете пустую строку...

Чтобы этого не было, надо сбросить буфер, например, так:

сin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

(см. тут).

READ ALSO
Пропускать пустую переменную при вводе [требует правки]

Пропускать пустую переменную при вводе [требует правки]

Мы вводим переменные ,если мы нажмём Enter ,то пустая переменная пропустится и перейдёт ввод к другой переменнойКак сделать в с++ ?

340
Подключение библиотек к проекту C++

Подключение библиотек к проекту C++

Как можно подключить #include, но сразу ко всему проекту, а не прописывать много раз?

335
Нужно ли устанавливать mysql server

Нужно ли устанавливать mysql server

У меня на ноуте установлен XamppТам есть mysql

354
Как выбрать первые 10 строк в MySQL

Как выбрать первые 10 строк в MySQL

Подскажите как организовать поискНужно выводить следующие, либо предыдущие 10 строк

563