繁体   English   中英

C sscanf()强制数字输入

[英]C sscanf() force number input

我正在尝试使用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");
}

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

有什么建议?

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 == ',' || ...))) {
    // ...
}

sscanf不是你的朋友,在这里。 即使您检查结果以确保成功读取整个参数,也不能确保输入在有意义的意义上有效。

给出如下输入:

1!!!1!oneone!

读取第一个1后, %f解析将停止(但成功),并将读指针保留在下面! 这可能不是您认为的“有效输入”。

如果同一行上的任何内容被认为是垃圾,那么它就会变得困难,因为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; } 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM