当前位置:  开发笔记 > 编程语言 > 正文

如何使用scanf验证输入

如何解决《如何使用scanf验证输入》经验,为你挑选了2个好方法。

如何使用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了解内容.



1> paxdiablo..:

使用scanf()对于用户输入通常是一个坏主意,因为失败会将FILE指针留在未知位置.那是因为scanf代表"扫描格式化",并且没有比用户输入更多的未格式化.

我建议fgets()用来获取一行,然后sscanf()在字符串上实际检查和处理它.

这也允许您检查字符串中是否有您想要的字符(通过循环或正则表达式),这些scanf函数系列并不适合.

举例来说,使用scanf()a "%d""%f"将停止在第一个非数字字符所以不会捕获尾随错误"127hello",这将只给你127.并且使用它与无限制%s只是乞求缓冲区溢出.

如果你真的必须使用[]格式说明符(in scanf sscanf),我认为它不应该被遵循s.

而且,对于使用该建议的强大输入解决方案,请参见此处.一旦您将输入行作为字符串,您就可以sscanf了解内容.


+1:在scanf上使用sscanf的好建议.scanf(和sscanf)的另一个问题是,不适合转换类型范围的数字会导致未定义的行为并且无法检查错误,通常最好使用fgets和strtol/strtod.

2> Johannes Sch..:

您似乎想要验证字符串作为输入.这取决于您是否要验证字符串是否包含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例如,如果有什么不对的话会抛出异常.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有