Почему getline не работает на коммутаторе, и cin не принимает данные надлежащим образом?

#c #dev-c

#c #dev-c

Вопрос:

Мне нужно указать марку, модель и годы выпуска автомобиля, к которому подходит конкретный продукт. Программа собирается записать файл с текстом в нем, который будет наброском html. Мне нужна важная информация, вставленная в правильные места, чтобы быстро иметь возможность добавлять продукты на нашу веб-страницу. Когда я использую оператор switch или операторы if для разделения категорий продуктов, входные данные перепутываются и не позволяют мне ответить на один из вопросов. Я не могу просто использовать cin, потому что мне нужно брать даты, которые выглядят как «2008 — 2009 — 2010 — 2011».

Вот что у меня получилось на данный момент! Это обычный, cin я пробовал getline , вы могли бы быстро c я начал вчера, и я довольно новичок, так что простите меня, если это легко исправить, но я ничего не могу найти.

 #include <iostream>
#include <string>
#include <fstream>

using namespace std;

void proinfo();

int main()
{
    //Sytem Information
    system("TITLE This is a Beta of My Product Information Template Version 0.0.2");

    //I'm using this as a welcome screen to inform users of new improvements on patches and other pertinent information to the users
    cout << "Welcome To My Product Information Template Maker!!! n It Is Still In Development" << endl;
    cout << "nnworking features are:" << endl << "t-Nonen" << endl;
    system("PAUSE");
    system("CLS");
    proinfo();
}

void proinfo()
{
    //Declare Variables here
    int loop(1), protype;
    char make[256], model[256], year[256];
    string getinput;

    while(loop==1)
    {
        //This is the first menu the user sees where they have to choose what type 
        //of products users will be adding
        system("CLS");
        cout << "Welcome to My Product Information Template Version 0.0.0" << endl;

        cout << "Please select the number of the product" << endl;
        cout << "type you will be ading!n" << endl;

        cout << "1.Fe - Fe2 Moldings" << endl;
        cout << "2.CF - CF2 Moldings" << endl;

        cout << "What would you like to do? ";

        cin >> protype;

        if(protype==1)
        {
            //FE - FE2 Molding
            system("cls");

            cout << "You have selected" << endl;
            cout << "Fe - Fe2 Moldingsn" << endl;

            cout << "Please Enter the Make of the molding" << endl;
            cin >> make;

            cout << "Please Enter the Model of the molding" << endl;
            cin >> model;

            cout << "Please Enter the Years this molding fits" << endl;
            cin >> year;

            cout << "You have just created a template for a(n)" << year << " " << make << " " << model << endl;
            cout << "Check My Documents For a file called Fe-Fe2template.txt" << endl;

            //Asks to quit or restart
            cout << "Would you like to make another tempalte?" << endl;

            cin >> getinput;

            if(getinput=="yes")
            {
                cout << "Great, Lets keep working!" << endl;
                //End of If statement
            }

            system("PAUSE");
        }

        if(protype==2)  
        {
            //CF - CF2 Molding
            system("cls");

            //Asks to quit or restart
            cout << "Would you like to make another tempalte?" << endl;

            cin >> getinput;

            if(getinput=="yes")
            {
                cout << "Great, Lets keep working!" << endl;
                //End of If statement                   
            }

            system("PAUSE");

            //End of Protype Switch Statement               
        }

        //End of while loop              
    }
    //End of Proinfo()    
}
  

Комментарии:

1. Итак, в чем конкретно заключается ваш вопрос? Что делает программа, отличающаяся от того, что вы хотите, чтобы она делала?

2. Можете ли вы предоставить пример ввода и какой возможный результат / поведение вы ожидаете? Кроме того, ваша программа вошла бы в бесконечный цикл, у вас нет надлежащего выхода из while(1) цикла.

3. Отбросьте DevC — он больше не разрабатывается, и многие сказали бы, что его вообще не следовало разрабатывать в первую очередь. Переключитесь на Code::Blocks.

Ответ №1:

Измените year[256] на строку year;

Измените cin >> year; на getline(cin, год);

Добавьте строку cin.ignore(); перед getline.

Ваша основная проблема в том, что оператор stream >> оставляет новую строку в потоке, поэтому, когда вы пытаетесь использовать getline, он считывает пустую строку. ignore() переработает новую строку и позволит вам прочитать ожидаемую строку.

Итак, это должно помочь вам в вашем пути.

 cin.ignore();
cout << "Please Enter the Years this molding fits" << endl;
getline(cin, year);
  

У вас есть некоторые другие небольшие проблемы, но вы с ними разберетесь. Худшее — это забыть завершить цикл.

 if(getinput=="yes")
{
    cout << "Great, Lets keep working!" << endl;
   //End of If statement
}
else
{
    loop = 0;
    continue;
}
  

Комментарии:

1. Спасибо всем за помощь, я собираюсь попробовать. Извините, что спрашиваю это, если это глупо, но почему вы должны завершать цикл? Обычно я бы просто всегда выбирал yes во время экспериментов, а затем завершал с x, поэтому я не видел необходимости. Вызываю ли я утечки памяти, делая это таким образом.

2. Я не уверен, что вы подразумеваете под выходом с помощью x — закрыть окно терминала?

3. Да, я не знаю технического термина, я просто использую x в правом верхнем углу окна.

4. Да, это не способ правильно завершить программу. Он посылает сигнал для завершения работы вашего pgm, и если вы не обработаете его должным образом, он не сохранит данные и т.д. упорядоченным образом. Поместите exit в цикл и сделайте это правильно.