Sscanf并检测输入转换错误[C]

时间:2013-07-17 13:03:44

标签: c scanf

我想将程序参数转换为double。简单:我想将一个double值作为参数传递给我的程序。但为了使其正确,我想检测转换错误。我发现atof不是一个好选择,所以我切换到sscanf。继承我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    argc --;
    argv++;

    double s;
    int handle =-1;

    handle = sscanf(*argv, "%lf", &s);
            if(handle == -1)
            {
                fprintf(stderr, "Invalid input double!\n");

            }else{ printf("%f\n", s);}

    return 0;
}

但输入错误,即:./code blabla打印出0.0000000000错了?

2 个答案:

答案 0 :(得分:2)

使用strtod代替scanf系列。如果无法解析数字,则返回0.0(不幸的是,当数字实际为0.0时)。您可以使用endptr参数来检查函数停止解析数字的位置,以便可以用于检查字符串是否包含有效数字。当无法表示值时,它会设置errno

答案 1 :(得分:2)

来自Linux Programmer's Manual on scanf(3)

  

返回值

     

这些函数返回成功匹配和分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零

     

如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符(请参阅error(3)),并设置errno表示错误。

因此,您应该检查handle < 1

您也可以尝试strtod(3)