验证用户输入的数字是否有效[从'char'到'char *'的无效转换]

时间:2019-01-26 21:18:38

标签: c++ arrays pointers c++98

好,所以我是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:注意:初始化'bool isNum(char *)'的参数1  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 :(得分:1)

您去了,我已经评论了我已更改的内容

#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";
        }

    }

答案 1 :(得分:1)

如果您想练习复杂的算法,那么解析数字是一个很好的练习。但是,如果您的目标是编写有用的简单程序,那么您走错了路。在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 ++标头并不十分熟悉,因此我可能忘记了包含其他标头。但是即使我没有测试它,其余的代码也应该没问题。

答案 2 :(得分:1)

以下功能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;
}