c++ - 如何使用 scanf 验证输入

标签 c++ c scanf

如何使用 scanf 验证用户输入。现在我有这样的东西,但不起作用。

注意:我有 atoi 只是为了验证 scanf 验证是否有效。

scanf("%[0987654321.-]s",buf);

i = atoi(buf);

if(i)
    index = i;

最佳答案

使用 scanf() 通常不是用户输入的好主意,因为失败会将 FILE 指针留在未知位置。那是因为 scanf 代表“扫描格式化”,并且未格式化比用户输入多一点。

我建议使用 fgets() 获取一行,然后在字符串上使用 sscanf() 来实际检查和处理它。

这还允许您检查字符串中是否包含您想要的字符(通过循环或使用正则表达式),而 scanf 函数系列并不真正适用于此。

例如,将 scanf()"%d""%f" 一起使用将在第一个非-number 字符,因此不会捕获像 "127hello" 这样的尾随错误,它只会给你 127。将它与无界 %s 一起使用只是 乞求缓冲区溢出。

如果你真的必须使用 [] 格式说明符(在 scanf sscanf 中),我不不要认为它后面是 s

并且,对于使用该建议的稳健输入解决方案,请参阅 here .一旦您将输入行作为字符串,您就可以sscanf 到您满意的位置。

关于c++ - 如何使用 scanf 验证输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456303/

相关文章:

c++ - 如果你有另一个因素和溢出的产品,你如何计算一个因素?

C 程序未完成所有步骤

c - 如何在函数中返回指针?

c++ - 在cpp中读取Fortran指数表示法

c - 使用 sscanf 从行读取,包括空格,中断其他字符

c - C 中的 Fscanf 用于存储文件中的数据

c++ - 我应该提到纯虚函数中的调用约定吗?

c++ - 从 end() 函数返回的迭代器获取 BST 的最后一个节点?

c - 通过使用 sscanf 提取数据在 BST 插入函数中传递参数

C++11 可变参数模板和逗号分隔表达式等价