printf区分字符和数字

时间:2016-09-26 22:26:23

标签: c

我正在尝试制作一个采用命令行输入并将[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;

}

2 个答案:

答案 0 :(得分:3)

您可以使用isdigit来判断某个字符是否为数字(您仍需要稍后将其转换为该数字的值)。

但你真正想要的是使用sscanf / strtofatof无法告诉你它失败了)并且不用担心手动字符串到数字的转换。

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引用的位置。