如何在c ++中对命令行输入进行类型检查

时间:2014-08-07 11:04:44

标签: c++ command-line-arguments

我有一个简单的代码,其中我发现简单的兴趣和复利。我面临的问题是我必须使用CLI进行输入。 我需要一个int和两个浮点数来工作。早些时候我正在使用cin.fail(),它正在为我做类型检查,并且工作得很好,但我需要使用CLI输入如1000 1? 5被视为无效。请帮忙。

#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstdlib>

using namespace std;

int main(int argc, char *argv[])
{  
    int p;
    float r,t,ci;

    p=atoi(argv[1]);
    r=atof(argv[2]);
    t=atof(argv[3]);

    if(p<=0 || r==0 || t<=0) {
        //we want p>0 t>0 and r==0 from the logic that atof will retrun 0 if r is non numeric
        cout<<"Invalid Input"<<endl;
    }
    else {
        float si=(p*r*t)/100;
        cout<<"Simple interest:"<<fixed<<setprecision(2)<<si<<endl;
        ci=p*pow((1+r/100),t)-p;
        cout<<"Compound interest:"<<ci<<endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:0)

尝试将此功能添加到您的代码中:

#include <ctype.h>

static bool isnumeric(char* theArgument, int maxdec)
{
    int decimalpoint = 0;
    while(*theArgument)
    {
        if (!isdigit(*theArgument))
        {
            if ('.' == *theArgument && maxdec <= ++decimalpoint)
            {
                continue;
            }
            return false;
        }
    }
    return true;
}

为每个参数调用它,参数可以允许的最大小数点数。在您的情况下,这将是isnumeric(argv[1],0)isnumeric(argv[2],1)isnumeric(argv[3],1)。这将告诉您数字实际上是否格式化为非负十进制数。更多逻辑(此处未显示)也会告诉您它们是否有减号。

答案 1 :(得分:0)

您可以使用strtolstrtod代替atoiatof

long int p;
double r,t;

char* endptr1;
char* endptr2;
char* endptr3;

p = strtol(argv[1], &endptr1, 10);
r = strtod(argv[2], &endptr2);
t = strtod(argv[3], &endptr3);

if (*endptr1 != 0 || *endptr2 != 0 || *endptr3 != 0)
{
    cout<<"Invalid Input"<<endl;
}
else
{
    ...
}

答案 2 :(得分:0)

argv是字符数组,因此它包含更多字符。

解决方案应该是:

  1. 将您的argv分解为3个部分,分隔符应为空格(或多个)符号。
  2. 现在使用strtolstrtod投放它。
  3. 验证。 strtolstrtod如果没有成功则返回零,因此如果您为零,请检查输入是否为实际'0'