Laske Ответов: 2

Возникли проблемы с проектом


Эй, ребята в Нью-Йорке, и я начал изучать программирование 2 недели назад, и я работал над каким-то проектом form book Learn programming with C++ book и похоже, что часть кода в этой книге устарела(пытался найти в Интернете решение, но все выглядит так же ... ). Так что у меня есть проблема с циклами for. Когда я выполняю программу, она показывает 1 сообщение, и пользователь должен ответить "да", а после этого он показывает сообщение 2, но программа не ждет, пока пользователь введет "значение", а вместо этого программа выполняет следующее сообщение из цикла FOR И завершает программу(это сообщение должно быть выполнено только в том случае, если номер студента был недействительным ).

Как выглядит программа при выполнении:
Do you want to calculate the grade ? : YES
 Enter student type " << "(1-English, 2-Math,3-Sience):Please enter valid number...
Process returned 1 <0x1> execution time ...


Что я уже пробовал:

cout << "Do you want to callculate the grade ? : ";
    cin >> gradestocalculater;

    for (int i = 0; i < gradestocalculater.length();i++){
        gradestocalculater[i] = toupper(gradestocalculater[i]); //WORKING COMMAND 
    }

    while(gradestocalculater == "YES")
    {

    cout << "Enter student type " << "(1-English, 2-Math,3-Sience): "; // COMAND EXECUTED
    cin.getline(response,256); //COMAND DONT WORKING ???

    if (strlen(response) == 0){
        cout << "Please enter valid number...";
        return 1;} 

2 Ответов

Рейтинг:
15

Jochen Arndt

Это происходит потому, что вы используете два метода для чтения входных данных:
то оператор>> (istream) - ссылка на C++ [^] (также названный добыча оператор и istream::getline - ссылка на C++ [^].

Первый будет читать строки до тех пор, пока не появится символ пробела (который включает в себя \n новая строка при нажатии клавиши Enter) без сохранения и считывания этого символа пробела в то время как getline() считывает до и включая символ новой строки, сохраняя его не в предоставленном буфере.

Таким образом, первый будет считывать входные данные (предполагая, что "да"), но новый символ строки, который останавливает чтение, все еще находится во входном буфере. При звонке getline() после этого он сначала прочитает символ новой строки и вернет пустой буфер.

Общее решение этой проблемы состоит в том, чтобы избежать смешивания этих двух методов ввода. В большинстве случаев с помощью getline() это лучший метод, потому что он позволяет вводить строки, содержащие пробелы.


Laske

Черт бы тебя побрал :D , Спасибо человеку, действительно ценю это.

Jochen Arndt

Добро пожаловать и спасибо Вам за обратную связь и принятие моего решения.

Laske

Есть ли какой-нибудь способ сделать это с помощью поплавков и целых чисел?
cin >> float; не работает,а также getline(cin, float) не работает.

Jochen Arndt

std::cin >> var работает также для bool, int, float и double.

Если у вас есть строка, используйте atof() или strtod (), чтобы преобразовать ее в double, atoi (), чтобы преобразовать в int или strtol() / strtoul (), чтобы преобразовать в long / unsigned long.

Laske

спасибо снова :)

Рейтинг:
0

KarstenK

Первая помощь:

cout << "Response: " << response;

Ответ считывается, но длина больше нуля, и вы обрабатываете код после этого, но не так, как хотели.

Используйте отладчик чтобы посмотреть, что происходит.