如何使用scanf验证用户输入.现在我有类似的东西,但不起作用.
注意:我有atoi只是为了验证scanf验证是否有效.
scanf("%[0987654321.-]s",buf); i = atoi(buf); if(i) index = i;
paxdiablo.. 15
使用scanf()
对于用户输入通常是一个坏主意,因为失败会将FILE
指针留在未知位置.那是因为scanf
代表"扫描格式化",并且没有比用户输入更多的未格式化.
我建议fgets()
用来获取一行,然后sscanf()
在字符串上实际检查和处理它.
这也允许您检查字符串中是否有您想要的字符(通过循环或正则表达式),这些scanf
函数系列并不适合.
举例来说,使用scanf()
a "%d"
或"%f"
将停止在第一个非数字字符所以不会捕获尾随错误"127hello"
,这将只给你127.并且使用它与无限制%s
只是乞求缓冲区溢出.
如果你真的必须使用[]
格式说明符(in scanf
或 sscanf
),我认为它不应该被遵循s
.
而且,对于使用该建议的强大输入解决方案,请参见此处.一旦您将输入行作为字符串,您就可以sscanf
了解内容.
使用scanf()
对于用户输入通常是一个坏主意,因为失败会将FILE
指针留在未知位置.那是因为scanf
代表"扫描格式化",并且没有比用户输入更多的未格式化.
我建议fgets()
用来获取一行,然后sscanf()
在字符串上实际检查和处理它.
这也允许您检查字符串中是否有您想要的字符(通过循环或正则表达式),这些scanf
函数系列并不适合.
举例来说,使用scanf()
a "%d"
或"%f"
将停止在第一个非数字字符所以不会捕获尾随错误"127hello"
,这将只给你127.并且使用它与无限制%s
只是乞求缓冲区溢出.
如果你真的必须使用[]
格式说明符(in scanf
或 sscanf
),我认为它不应该被遵循s
.
而且,对于使用该建议的强大输入解决方案,请参见此处.一旦您将输入行作为字符串,您就可以sscanf
了解内容.
您似乎想要验证字符串作为输入.这取决于您是否要验证字符串是否包含double或int.以下检查double(允许前导和尾随空格).
bool is_double(char const* s) { int n; double d; return sscanf(s, "%lf %n", &d, &n) == 1 && !s[n]; }
sscanf
将返回转换的项目(没有'%n').n
将被设置为已处理的输入字符的数量.如果处理了所有输入,则s [n]将返回终止0字符.两个格式说明符之间的空格占可选的尾部空格.
以下检查int,使用相同的技术:
bool is_int(char const* s) { int n; int i; return sscanf(s, "%d %n", &i, &n) == 1 && !s[n]; }
有对一个问题在这里,其中也包括这样做更多的C++"ISH的方式,比如使用字符串流和功能从提升,喜欢的lexical_cast等.它们通常比scanf这样的函数更受欢迎,因为很容易忘记将一些'%'传递给scanf或某个地址.scanf不会识别,但是会做任意事情,而lexical_cast例如,如果有什么不对的话会抛出异常.