C 试图检查无效输入
Posted
技术标签:
【中文标题】C 试图检查无效输入【英文标题】:C Trying to check for invalid input 【发布时间】:2012-10-16 00:10:33 【问题描述】:我正在使用scanf("%s", u);
,所以我使用了一个字符串。我可以使用字符q
、c
、-
、+
、/
、*
、%
、^
、=
和整数,但对于其他我想要的我的程序显示错误消息。我怎么知道它是否是任何其他字符,因为如果他们放入除这些字符之外的任何其他字符,它将进入一个 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 输入中的列数无效(已检查其他问题)