C ++ - isdigit не работает должным образом и вызывает бесконечный цикл

0

Я создаю программу, которая преобразует десятичные значения в двоичные значения. Проблема, с которой я сталкиваюсь, заключается в том, что в моем операторе if я проверяю, содержит ли пользователь ввод для моей переменной int decimal до того, как он перейдет к преобразованию значений, но когда это цифры, он считает их альфа-символами, которые затем вызывают программа для бесконечной циклы.

Когда я меняю isdigit(decimal) на !isdigit(decimal) выполняется преобразование, но если я помещаю альфа-символы, он будет бесконечно циклически повторяться. Я делаю что-то действительно глупое?

#include <iostream>
#include <string>
#include <ctype.h>
#include <locale>

using namespace std;

string DecToBin(int decimal)
{
    if (decimal == 0) {
        return "0";
    }
    if (decimal == 1) {
        return "1";
    }

    if (decimal % 2 == 0) {
        return DecToBin(decimal/2) + "0";
    }
    else {
        return DecToBin(decimal/2) + "1";
    }
}

int main()
{
    int decimal;
    string binary;

    cout << "Welcome to the Decimal to Binary converter!\n";

    while (true) {
        cout << "\n";
        cout << "Type a Decimal number you wish to convert:\n";
        cout << "\n";
        cin >> decimal;
        cin.ignore();
        if (isdigit(decimal)) { //Is there an error with my code here?
            binary = DecToBin(decimal);
            cout << binary << "\n";
        } else {
            cout << "\n";
            cout << "Please enter a number.\n";
        }
    }

    cin.get();
}
  • 0
    Попробуйте просмотреть код с помощью отладчика и посмотрите, что получится.
  • 0
    Отладчик Dev-C ++ ничего мне не дает, он успешно компилируется, и когда я делаю что-то, что вызывает проблему, он ничего мне не возвращает
Показать ещё 1 комментарий
Теги:
infinite-loop

1 ответ

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

Прежде всего, чтобы проверить число в смеси числа и символов, не вводите ввод в int. Всегда используйте std::string

int is_num(string s)
{
    for (int i = 0; i < s.size(); i++)
        if (!isdigit(s[i]))
            return 0;
    return 1;
}

int main()
{
    int decimal;
    string input;
    string binary;
    cout << "Welcome to the Decimal to Binary converter!\n";
    while (true) {
        cout << "\n";
        cout << "Type a Decimal number you wish to convert:\n";
        cout << "\n";
        cin >> input;
        cin.ignore();
        if (is_num(input)) { //<-- user defined function
            decimal = atoi(input.c_str()); //<--used C style here
            binary = DecToBin(decimal);
            cout << binary << "\n";
        } else {
            cout << "\n";
            cout << "Please enter a number.\n";
        }
    }
    cin.get();
}

Вы всегда можете написать функцию для проверки числа в строке, как показано выше. Теперь ваш код не запускается в бесконечный цикл. Более того, если вы хотите принять только один действительный ввод и выйти из программы, вы можете добавить break

if (is_num(input)) {
    decimal = atoi(input.c_str()); 
    binary = DecToBin(decimal);
    cout << binary << "\n";
    break; //<--
}
  • 0
    Это сработало блестяще, спасибо. Теперь я всегда буду вводить данные в строковый тип данных для подобных сценариев. Я держал while цикл , так что программа может быть использована несколько раз.

Ещё вопросы

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