isdigit () и isalnum () выдают ошибки, поскольку входные данные являются константными символами и не могут быть преобразованы.Другие способы возможно видеть, является ли вход число? - PullRequest
0 голосов
/ 26 апреля 2018

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

Что я пытаюсь сделать, это сделатьПостфиксное выражение калькулятора с использованием методов и шаблонов push и pop.

По словам моего профессора

Input

Входные данные представляют собой строку, которая представляет выражение Postfix.Чтобы упростить задачу, ваш калькулятор будет работать только с однозначными неотрицательными целыми числами.В строке допускаются только следующие символы:

операторы '+', '-'.'*' и '/' цифры от 0 'до' 9 'пробел (пробел) символ' '

Пример ввода: 2 4 3 * +

Результат: 14

Чтобы обработать пробелы во входных данных, вам нужно сделать одно небольшое дополнение к алгоритму на стр. 204 вашего учебника:

    if (ch is a blank)
       ignore it    end if

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

#include <iostream>
#include <string>
#include "ArrayStack.h"
using namespace std;

int main()
{
    ArrayStack<string> stack;
    string items;
    bool done = false;
    char decision; 

    while(!done) // check to see if the user wants to do more calculations
    {
        cout << "Enter postfix expression: ";
        getline(cin, items);


        for(int x = 0;x < items.length();x++)
        {
            stack.push(&items[x]);
            cout << "Pushing " << &items[x] << endl;

        }

        cout << "Done? Y/N: ";
        cin >> decision;
        if((decision == 'y') || (decision == 'Y')) done = true;
    }
}

и вот относительная функция шаблона

template<class ItemType>
bool ArrayStack<ItemType>::push(const ItemType& newEntry)
{
    bool result = false;    
    if (top < MAX_STACK - 1)  // Does stack have room for newEntry?
    {
        //////////////////////////////////////
        if(isdigit(&newEntry))
        {
            top++;
            items[top] = newEntry;
            result = true;
        }
        //////////////////////////////////////
    }  // end if

    return result;
}  // end push

Моя проблемаisdigit ничего не может сделать, когда он является постоянным символом, но мне не разрешено проверять, является ли это цифра, пробел или / - + * в основном файле.Я не уверен, как поступить.Я использую неправильную функцию или просто неправильно ее использую?

1 Ответ

0 голосов
/ 26 апреля 2018

вместо этого вы можете изменить тип на unsigned char.

ArrayStack<unsigned char> stack;

Для isdigit() работает с unsigned char.

Кроме того, нажмите unsigned char элементы вваш цикл, а не pointer:

stack.push(items[x]); // don't pass a pointer

ОБНОВЛЕНИЕ

Согласно isdigit() в cppreference :

Поведение не определено, если значение ch не представляется как unsigned char и не равно EOF.

, что отличается от cplusplus.com .Так что примите к сведению.

Таким образом, ваш ItemType должен быть unsigned char

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...