我有一个简单的代码,其中我发现简单的兴趣和复利。我面临的问题是我必须使用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;
}
答案 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)
您可以使用strtol
和strtod
代替atoi
和atof
:
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
是字符数组,因此它包含更多字符。
解决方案应该是:
strtol
和strtod
投放它。strtol
和strtod
如果没有成功则返回零,因此如果您为零,请检查输入是否为实际'0'
。