C sscanf()强制数输入

时间:2017-01-28 23:58:26

标签: c scanf stdio

我正在尝试使用sscanf()来验证命令行输入

我只想要经历1次,0.1次,0.111次等事情, 不是a12 12a或1.2a

我试过

if (sscanf(input, "%f", &val) != 1) { // to check for 1 successful conversion
      printf("invalid input");
}

但似乎我也让无效的输入通过。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

sscanf(input, "%f", &var)遇到输入12a1.2a时,它会在无效的输入部分停止,剩下的字符可供后续格式代码读取。

请考虑以下字符串在有效数字后面的浮点数具有无效字符:

  • 1.0 2.0(空格)
  • 1.0, 2.0(逗号)
  • 1.0a 2.0(一封信)

空格和逗号对我们的人工解析引擎看起来不错;当找到无效字符时,机器浮点解析只会停止,无论是人类可接受的空格还是逗号,还是丑陋的字母。

如果你想确保浮点数不会立即被垃圾跟踪,你可以使用类似的东西:

n = sscanf(input, "%f%c", &var, &ch);
if (n == 1 ||
     (n == 2 && (ch == ' ' || ch == ',' || ...))) {
    // ...
}

答案 1 :(得分:1)

sscanf不是你的朋友,在这里。即使你检查结果 确保你成功地阅读了一个完整的论点,但并不是这样 确保输入在有意义的意义上有效。

给出如下输入:

1!!!1!oneone!

%f解析将在读取第一个1后停止(但成功), 并将读指针保留在以下!。这可能不是什么 你考虑"有效输入"。

如果同一行上的任何内容被认为是垃圾,那么它就会得到 困难,因为scanf没有区分空格和 换行。也许尝试这样的事情:



int main(int argc, char *argv[])
{

    float val;
    char c;
    if (sscanf(argv[1],"%f%c",&val,&c)!=1)
    {
        printf("invalid input");
    }
    return 0;
}




现在它将验证所有命令行输入是否为浮动数字输入。