防止在流中输入不需要的值
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 >> whatever
) 来执行此操作 - 错误检查的选项太有限了。
【讨论】:
以上是关于防止在流中输入不需要的值的主要内容,如果未能解决你的问题,请参考以下文章
OpenID Connect 服务器流中的“state”参数可以防止啥攻击?