Я пытаюсь использовать цикл do while, чтобы повторить определенную часть моей программы, и она отказывается работать должным образом

0

Хорошо, так как название говорит о том, что он отказывается выполнять материал прямо под функцией "do", хотя, насколько я могу сказать, все параметры для повтора выполнены. До тех пор, что я получаю, когда я запускаю программу, это что-то вроде... "Не хотите ли вы найти другое имя? Пожалуйста, введите Y для да и n для нет:" цикл снова и снова, когда я нажимаю y

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main()
{
    vector <string> vName, vID, vClass;
    string sName, sID, sClass, sSearch, cQuestion;
    int iSize, iStudent;
    // Display initial vector size
    iSize = vName.size();

    cout << "Student list starts with the size:" << iSize << endl;

    // Get size of list from user

    cout << "How many students would you like to add?" << endl;
    cin >> iStudent;
    cin.ignore();
    // Get names, ids, and classes

    for (int i = 0; i < iStudent; i++)
    {
        cout << "Student" << i + 1 << ":\n";
        cout << "Please enter the student name: ";
        getline(cin, sName);
        vName.push_back(sName);

        cout << "Enter ID number ";
        getline(cin, sID);
        vID.push_back(sID);

        cout << "Enter class name ";
        getline(cin, sClass);
        vClass.push_back(sClass);

    }
    // Display header

    cout << "The list of students has the size of: " << iStudent << endl;
    cout << "The Student List" << endl;
    cout << "\n";
    cout << "Name:" << setw(30) << "ID:" << setw(38) << "Enrolled Class : " << endl;
    cout << "--------------------------------------------------------------------------";
    cout << "\n";

    // for loop for displying list
    for (int x = 0; x < vName.size() && vID.size() && vClass.size(); x++)
    {

        cout << vName[x] << "\t \t \t" << vID[x] << "\t \t \t" << vClass[x] << endl;
    }

    // Sorting function
    cout << "\n";
    cout << "The Student List after Sorting:" << endl;
    cout << "\n";

    sort(vName.begin(), vName.end());

    for (int y = 0; y < vName.size(); y++)
    {
        cout << vName[y] << endl;
    }

    cout << "\n";

    // Search function

    do
    {
        cout << "Please Enter a name to be searched:" << endl;
        getline(cin, sSearch);
        if (binary_search(vName.begin(), vName.end(), sSearch))
        {


            cout << sSearch << " was found." << endl << endl;
        }

        else
        {

            cout << sSearch << " was not found." << endl << endl;


        }

        cout << "Would you like to search another name?" << endl << endl;

        cout << "Please enter Y for Yes and N for No:" << endl << endl;
        cin >> cQuestion;

    } while (cQuestion == "Y" || cQuestion == "y");


    cout << "Thank you for using this program!" << endl;

    return 0;
}

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

  • 2
    Вы не показали свою полную программу, поэтому все, что я могу сделать, - это угадать, но я предполагаю, что cQuestion - это символ, и вы должны написать «Y», а не «Y» в условии.
  • 0
    Скомпилируйте все предупреждения и отладочную информацию, затем используйте отладчик.
Теги:
visual-c++

2 ответа

1
Лучший ответ

Хвост вашей циклы делает это:

cout << "Please enter Y for Yes and N for No:" << endl << endl;
cin >> cQuestion;

который будет потреблять вашу строку, если вы ввели ее, но оставьте конечную новую строку во входном потоке. Таким образом, когда вы возвращаетесь в верхнюю часть цикла после ввода Y или y и делаете это:

cout << "Please Enter a name to be searched:" << endl;
getline(cin, sSearch);

getline будет извлекать пустую строку.

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

И в качестве примечания, я бы настоятельно посоветовал вам проверить ваши потоковые операции на успех, прежде чем предположить, что они "просто сработали". Это трудная, но необходимая, привычка ломаться. Что-то вроде этого:

do
{
    cout << "Please Enter a name to be searched:" << endl;
    if (!getline(cin, sSearch))
        break;

    if (binary_search(vName.begin(), vName.end(), sSearch))
    {
        cout << sSearch << " was found." << endl << endl;
    }
    else
    {
        cout << sSearch << " was not found." << endl << endl;
    }

    cout << "Would you like to search another name?" << endl << endl;
    cout << "Please enter Y for Yes and N for No:" << endl << endl;

} while (getline(cin,cQuestion) && (cQuestion == "Y" || cQuestion == "y"));
  • 0
    Ого, я не могу поверить, что это была буферная вещь. Я буду иметь в виду этот совет WhozCraig, я все еще новичок в c ++, и я еще не выяснил, как правильно отлаживать программы, кроме как нажать F5. Всем спасибо!
  • 0
    @ZeeZeeZee вы знаете, как принять ответ, верно?
Показать ещё 2 комментария
0

Если cQuestion является массивом символов, тогда вам нужно использовать strcmp или stricmp для сравнения с другой строкой, то есть "Y" и "y" в этом случае. Если cQuestion - это один символ, вам нужно сравнить с 'Y' и 'y' (т.е. с одной цитатой)

Строки в C++ не являются типами первого класса, поэтому у них нет какой-либо строковой операции, которая существует для других базовых типов, таких как int и float. У вас есть std :: string как часть стандартной библиотеки C++, которая почти выполняет пустоту.

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

  • 0
    Это на самом деле строка. Я пробовал оба типа данных char и строки, которые, кажется, не работают. Моя последняя итерация - попытаться преобразовать ее в строковый тип данных ... Я опубликую всю программу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню