我正在尝试制作一个采用命令行输入并将[1]除以[2]的算法(假设[1]和[2]是数字,而[2]不是0)但是
if ((atof(argv[2]) == 0))
由于某种原因,接受字母和数字。
我当前的代码无法区分0和字母。我该如何解决?我一周前才开始编码,所以如果我的代码很乱,我很抱歉,感谢您提供任何帮助。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
if ((atof(argv[2]) == 0))
{
printf("invalid input - divide by zero not allowed\n");
return 0;
}
else if ((atof(argv[1])) && (atof(argv[2])))
{
float sum = 0;
sum = (atof(argv[1])) / (atof(argv[2]));
printf("%f\n", sum);
return 0;
}
else
printf("invalid input\n");
return 0;
}
答案 0 :(得分:3)
您可以使用isdigit
来判断某个字符是否为数字(您仍需要稍后将其转换为该数字的值)。
但你真正想要的是使用sscanf
/ strtof
(atof
无法告诉你它失败了)并且不用担心手动字符串到数字的转换。
float numerator, denominator;
bool success = sscanf(argv[1], "%f", &numerator) == 1;
success = success && (sscanf(argv[2], "%f", &denominator) == 1);
if(success && denominator != 0) { // float to value comparison is almost always a bad idea
printf("Fraction: %f\n", numerator/denominator);
} else {
printf("Failure\n");
}
答案 1 :(得分:1)
你应该使用strtof函数而不是atof
float strtof(const char *nptr, char **endptr);
nptr是指向要解释为float的字符串的指针。 endptr必须是char指针的地址(这就是为什么它有双星,它是指向char指针的指针)。
该函数存储第一个字符的地址,该地址超过了endptr指向的char指针中解释的最后一个字符。
如果没有执行转换,则返回零,并且nptr的值存储在endptr引用的位置。