我正在使用scanf("%s", u);
,所以我拿了一个字符串。我可以使用字符q
, c
, -
, +
, /
, *
, %
, ^
,=
和整数,但对于其他所有内容,我希望我的程序显示错误消息。我怎么知道它是否是任何其他字符,因为如果他们放入除这些字符之外的任何其他字符,它将进入一个 if 语句,该语句假定它是字符串中的一个整数,atoi()
然后它等于 0 并破坏事物。
3 回答
您可以使用scanf格式说明符来确保它在遇到无效字符之一时停止接受输入。 %[...]
它允许您指定要存储的一组字符(可能在字符数组中)。当匹配不在集合中的字符时,转换停止。例如,%[0-9] 表示“匹配从零到九的所有数字”。%[AD-G34] 表示“匹配 A、D 到 G、3 或 4”。
您可以告诉 scanf() 匹配不在集合中的字符,方法是在 %[ 之后直接放置一个插入符号 (^) 并在其后跟上集合,如下所示:%[^AC],这意味着“匹配所有字符不是 A 到 C。”
简短的回答是,scanf()
这对这项工作来说是错误的工具。您可能应该考虑fgets()
(或类似 POSIX 2008 的等价物readline()
)。这会将整行读入内存。然后,您可以解析字符串,可能使用sscanf()
,可能是其他一些识别有效标记(一个或多个字符的序列)和错误的“标记化”机制。
请参阅为什么这接受无效输入中的代码?有关如何在每个输入行中读取一个数字的示例。您想根据自己的目的进行调整;它不是很合适,但它是数字解析的一个很好的起点。还要注意atoi()
没有错误检测;它仅适用于非常良性的环境(例如您可能正在工作的环境)。
一种替代方法是始终扫描一个字符串并循环遍历它并检查您想要的条件,如果它没有通过,您发送错误消息,否则您使用它。我相信这将是最简单的方式,因为输入始终是字符。