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

Preventing from entering unwanted value with in stream

本文关键字:不需要 输入      更新时间:2023-10-16

这是我的第二篇文章。

我想询问std :: cin的概念,我想制作一个节省个人信息并在流中显示的程序,但是我需要确保用户不能输入与字符串和字符串和字符串和int中的"名称,姓氏,年龄"变量。
这是我的代码:

#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打交道。如果有人可以解释解决这些问题的基本概念,我将很感激。

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

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

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

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

通常,您不会使用输入流操作员(cin >> whatever)来执行此操作 - 错误检查选项过于限制。