防止在流中输入不需要的值

Posted

技术标签:

【中文标题】防止在流中输入不需要的值【英文标题】:Preventing from entering unwanted value with in stream 【发布时间】:2017-03-15 06:50:07 【问题描述】:

这是我在这里的第二个帖子。

我想询问 std::cin 的概念,我想制作一个程序来保存个人信息并将其显示在流中,但我需要确保用户不能输入不同于字符串的值类型和int in "name, surname, age" 变量。 这是我的代码:

#include <iostream>
#include <string>

void getInformation(std::string & name, std::string & surname, int & age) 
    std::cout << "Enter name: ";
    std::cin >> name;

    std::cout << "Enter surname: ";
    std::cin >> surname;

    std::cout << "Enter age: ";
    std::cin >> age;


void showInformation(std::string name, std::string surname, int age) 
    std::cout << "Name: " << name << std::endl;
    std::cout << "Surname: " << surname << std::endl;
    std::cout << "Age: " << age << std::endl;


int main() 
    std::string name[ 2 ];
    std::string surname[ 2 ];
    int age[ 2 ];

    for( int i = 0; i < 2; i++ )
        getInformation( name[ i ], surname[ i ], age[ i ] );

    for( int i = 0; i < 2; i++ )
        showInformation( name[ i ], surname[ i ], age[ i ] );
    return 0;

我知道这是一个非常基本的问题,但我发现很难处理 cin.good、cin.sync。如果有人能解释处理这些问题的基本概念,我将不胜感激。

【问题讨论】:

最常见的方法是,记录在字符串或可以包含所有内容的变量类型中输入的所有内容,然后通过检查是否是数字或任何标准来验证输入适用于输入。之后,可以根据您要存储的信息将输入转换为适当的格式,例如 int。 请澄清问题。假设正在输入年龄。您想要实现哪种行为:(1)如果用户输入一个包含非数字字符的字符串,则再次查询年龄或(2)如果用户按下键盘上的非数字键,则没有任何反应(此字符不是甚至显示在控制台屏幕上)? 第 (1) 个是我的确切意图。 【参考方案1】:

根据 Aeonos 的评论,我建议首先将所有输入记录到 std::string 中,然后使用一些转换库来转换值,例如boost::lexical_cast。

【讨论】:

【参考方案2】:

在标准 C++ 中没有办法阻止用户以不同于程序期望的形式提供输入。

最可能的是以某种形式读取所有输入,分析输入,丢弃不需要的部分,并根据需要解释其余部分。

Aeonos 在 cmets 中提到的一个示例是将所有数据读取到 std::string(例如使用 std::getline(std::cin, some_std_string))。读取字符串后,可以检查它是否包含名称(无论如何指定)或整数(假设它仅包含数字,如果您希望输入正整数)。如果字符串不包含所需的输入形式,则丢弃输入并重复该过程(例如在循环中)。如果它确实包含所需形式的输入,请提取所需的值。

通常您不会使用输入流操作符 (cin &gt;&gt; whatever) 来执行此操作 - 错误检查的选项太有限了。

【讨论】:

以上是关于防止在流中输入不需要的值的主要内容,如果未能解决你的问题,请参考以下文章

在流中查找的值少于几倍,然后是最大值

OpenID Connect 服务器流中的“state”参数可以防止啥攻击?

使用 jQuery 防止 html 输入中的值

java的io流中,啥时候应该在流关闭之前加flush,啥时候不用

如何在流中定义具有指定类型的所有可选字段的泛型类型

检查输入的值是不是存在 IF 是 防止保存 否则