C尝试检查无效输入

时间:2012-10-16 00:10:33

标签: c input scanf atoi

我正在使用scanf("%s", u);所以我拿了一个字符串。我可以接受字符qc-+/*%,{{1 }},^和整数,但对于其他一切,我希望我的程序显示错误消息。我怎么知道它是否是任何其他字符,因为如果它们放入除了那些之外的任何东西,它将进入if语句,假定它是字符串中的整数而=它然后等于0并破坏事物。

3 个答案:

答案 0 :(得分:2)

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

  

它允许您指定要存储的一组字符(可能   在一系列的字符中)。当一个字符没有时,转换就会停止   在集合中匹配。例如,%[0-9]表示“匹配所有数字   从零到九。“而%[AD-G34]的意思是”匹配A,D到G,3或者   4“。

     

您可以告诉scanf()匹配不在集合中的字符   通过在%[之后直接放置一个插入符号(^)并跟随它   设置,如下所示:%[^ A-C],表示“匹配所有字符   不是A到C.“

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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