C 试图检查无效输入

Posted

技术标签:

【中文标题】C 试图检查无效输入【英文标题】:C Trying to check for invalid input 【发布时间】:2012-10-16 00:10:33 【问题描述】:

我正在使用scanf("%s", u);,所以我使用了一个字符串。我可以使用字符qc-+/*%^= 和整数,但对于其他我想要的我的程序显示错误消息。我怎么知道它是否是任何其他字符,因为如果他们放入除这些字符之外的任何其他字符,它将进入一个 if 语句,该语句假定它是字符串中的一个整数,atoi() 它等于 0 并破坏了一切。

【问题讨论】:

【参考方案1】:

您可以使用scanf 格式说明符来确保它在遇到无效字符之一时停止接受输入。 %[...]

它允许您指定一组要存储的字符(可能 在一个字符数组中)。当字符不是 在集合中匹配。例如,%[0-9] 表示“匹配所有数字 0 到 9。”而 %[AD-G34] 表示“匹配 A、D 到 G、3 或 4"。

您可以告诉 scanf() 匹配不在集合中的字符 通过在 %[ 之后直接放置一个插入符号 (^) 并在其后面加上 设置,像这样:%[^A-C],意思是“匹配所有字符 不是 A 到 C。”

【讨论】:

【参考方案2】:

简短的回答是scanf() 是这个工作的错误工具。您可能应该考虑fgets()(或POSIX 2008 中的readline() 等等价物)。这会将整行读入内存。然后,您可以解析字符串,可能使用sscanf(),可能还有其他一些识别有效标记(一个或多个字符的序列)和错误的“标记化”机制。

请参阅Why does this accept invalid input? 的代码,了解如何在每个输入行中读取一个数字的示例。您想根据自己的目的进行调整;它不是很合适,但它是数字解析的一个很好的起点。还要注意atoi() 没有错误检测;它只适用于非常良性的环境(例如您可能正在工作的环境)。

【讨论】:

【参考方案3】:

另一种方法是始终扫描字符串并循环遍历它并检查您想要的条件,如果它没有通过,则发送错误消息,否则使用它。我相信这将是最简单的方式,因为输入始终是字符。

【讨论】:

以上是关于C 试图检查无效输入的主要内容,如果未能解决你的问题,请参考以下文章

字符串路径验证

第 1 行错误的 CSV 输入中的列数无效(已检查其他问题)

当输入无效时在 div 上添加抖动效果

React GraphQL 突变返回无效输入

在不验证文件路径的情况下检查文件名中的无效字符(特殊字符和国际字符)

用户输入给出“ValueError:int() 以 10 为底的无效文字:”