Подтверждение правильности введенного пользователем номера или [неверное преобразование из 'char' в 'char *'] - PullRequest
0 голосов
/ 27 января 2019

Хорошо, я новичок в c / c ++, и я создаю эту маленькую программу, которая проверяет, является ли введенный пользователем ввод действительным числом или нет, если это так, то он печатает «это число» или иначе он печатает«это символьная строка»

Некоторые примеры вывода

1 - is a number
-1.1 - is a number
1......1 - is a character string
three - is a character string
.12 is a character string
+0.12 is a number
ABC123ABC - is a character string

Я получаю эту ошибку в своем коде.Если бы кто-то мог помочь мне исправить это, я был бы очень признателен.TIA

cpp: 52: 23: ошибка: неправильное преобразование из 'char' в 'char *' [-fpermissive]

if (! IsNum (c [i]))

{~~~ ^ task1.cpp: 5: 19: примечание: инициализация аргумента 1 'bool isNum (char *)' bool isNum (char *)p) {

Мой код

#include <iostream>



bool isNum(char * p){
if (NULL == p || *p == '\0'){
    return false;
}
int dot = 0;
int plus = 0;
int minus = 0;

while(*p){
    char a = *p;
    switch (a)
    {
        //Only allows 1 dot
        case '.':
            if (++dot > 1){
                return false;
            }
            break;
        //only allows 1 plus sign
        case '+':
            if (++plus > 1){
                return false;
            }
        //only allows 1 minus sign
        case '-':
            if (++minus > 1){
                return false;
            }
        //Only allows 0-9
        default:
            if (a < '0' || a > '9'){
                return false;
            }

       }
        p++;
    }
    return true;
}

int main(){
    //char array of size 1024
    char c[1024];
    std::cout << "Enter something: ";
    std::cin >> c;

    for(int i = 0; i < sizeof(c); i++){
        if (!isNum(c[i])){
            std::cout << c << " is a character string";    
        }
        else {
            std::cout << c << " is a number";
        }

    }

}

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Если вы хотите практиковать сложные алгоритмы, анализ чисел является хорошим упражнением.Но если ваша цель - писать полезные, простые программы, вы на неправильном пути.В C ++ многие стандартные задачи уже решены стандартной библиотекой C ++, вам просто нужно их использовать.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string line;

    if (!std::getline(std::cin, line)) {
        std::cerr << "error reading the line\n";
        return 1;
    }

    std::istringstream in{line};
    double num;

    if (in >> num && in.peek() == EOF) {
        std::cout << "it's a number, " << num << "\n";
    } else {
        std::cout << "it's not a number\n";
    }
}

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

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

0 голосов
/ 27 января 2019

Следующая функция isNumber будет работать для вас.

  • Здесь я использую динамическую последовательность символов std::string, которая позволяет нам вводить строки любого размера, меньшие, чем std::string::max_size.

  • Мы можем проверить, является ли данный символ цифрой или нет, с помощью std::isdigit.

  • Никаких дополнительных копий и создание объектов не показали бы хорошую производительность.

  • Символы пробела не допускаются в левой и правой части входной строки.

Я также пишу явный тип итераторов и избегаю использования auto, потому что вы помечаете C++98:

#include <string>
#include <cctype>

bool isNumber(const std::string& s)
{
    // this also validates the following access to s[0]
    if(s.empty()){
        return false;
    }

    const std::size_t offset = (s[0] == '+' || s[0] == '-') ? 1 : 0;
    std::string::const_iterator begin = s.begin() + offset;

    // this also validates the following dereferencing begin
    if(begin == s.end()){
        return false; // false if just a sign "+" or "-"
    }

    if(!std::isdigit(static_cast<unsigned char>(*begin))){
        return false; // e.g. "+.123"
    }

    bool isdecimal = false;
    for(std::string::const_iterator it = ++begin; it != s.end(); ++it) 
    {
        if (!std::isdigit(static_cast<unsigned char>(*it)))
        {
            if(!isdecimal && (*it == '.'))
            {
                isdecimal = true;

                if((it+1) == s.end()){
                    return false; // e.g. "+1."
                }
            }
            else{
                return false;
            }
        }
    }

    return true;
}

Теперь легко и просто реализовать основную функцию:

DEMO

#include <iostream>

int main()
{
    std::string s;

    std::cout << "Enter something: ";
    std::getline(std::cin, s);
    std::cout << std::endl;

    std::cout 
        << s << " is a " 
        << (isNumber(s) ? "number." : "character string.");

    return 0;
}
0 голосов
/ 27 января 2019

Итак, я прокомментировал вещи, которые я изменил

#include <iostream>             
bool isNum(char * p) {
    if (NULL == p || *p == '\0') {
        return false;
    }
    int dot = 0;

    char a = *p;
    if (a<'0' || a>'9') {
        if (a != '-' && a != '+') { return false; }
        else p++;

    }


    if (*p<'0' || *p>'9') return false;
    p++;
    while (*p != '\0') {
        a = *p;
        switch (a)
        {
            //Only allows 1 dot
        case '.':
            if (++dot > 1) {
                return false;
            }
            p++;
            if (*p == '\0') return false;
            break;

        default:
            if (a < '0' || a > '9') {
                return false;
            }
            p++;
            break;
        }
    }

    return true;
}

    int main() {
        //char array of size 1024
        char c[1024];
        std::cout << "Enter something: ";
        std::cin >> c;

        // you don't need to loop through every character just pass your array of characters & your function is looping through it
        if (!isNum(c)) {
            std::cout << c << " is a character string";
        }
        else {
            std::cout << c << " is a number";
        }

    }
...