如何检查输入是否有效?

时间:2018-09-18 06:56:44

标签: c++

do{
std::cout << "Name? \n";
std::cin >> Name1;
getchar();
}while();

如何检查用户输入的是名称而不是数字?我尝试了cin.fail(),但似乎没有用。如果用户输入的是字符,基本上我想做的就是循环,例如:,。 +-等...或数字(0,1,2,4 ...),如果有一种方法可以做while(Name1!= std :: string)

2 个答案:

答案 0 :(得分:1)

正如其他人所建议的那样,可以用不同程度的难度来解决您的问题。

如果您将有效名称定义为不包含特殊字符或数字的字符串(即+-。0 ... 9等),则可以编写一个函数来检查输入的字符串是否仅包含字母字符。一种实现方法是使用std::isalpha

如果您已经阅读了sudo systemctl restart nginx 的链接参考,您将看到它检查给定字符是否为字母字符。您还可以获得方法std::isalpha的实现,该实现计算一个字符串中有多少个字符。

您可以检查引用count_alphas(const std::string& s) here,并且需要包括std::count_if才能使用。

<algorithm>

使用这种方法,您可以按照以下步骤完成代码

int count_alphas(const std::string& s)
{
    return std::count_if(s.begin(), s.end(), [](unsigned char c){ 
                             return std::isalpha(c); 
                         });
}

如果条件为true,则意味着您的字符串中的字母字符少于字符串的长度,因此您的名称不是您定义的有效名称。

如果您发现非字母字符,也可以使用std::find_if代替do{ std::cout << "Name? \n"; std::cin >> Name1; getchar(); }while(Name1.length() != count_alphas(Name1)); 直接返回false,您可以尝试自己实现。

如果您不习惯使用算法或lambda,则可以存储不使用的内容
不想以有效名称出现在字符串向量中,并遍历输入名称以查看是否包含向量的任何存储元素。如果是这样,则它现在是有效名称。

答案 1 :(得分:0)

您可以使用正则表达式检查输入是否有效。

#include <regex>
#include <string>
#include <iostream>
int main()
{
    std::regex name("[[:alpha:]]+"); // Match 1 or more alphabetic characters 
    while (true)
    {
        std::string input;
        std::cout << "Enter name: " << std::endl;
        std::getline(std::cin, input);
        if (std::regex_match(input, name))
            std::cout << "Input is a name" << std::endl;
        else
            std::cout << "Input is not a name" << std::endl;
    }

    return 0;
}

您可以找到正则表达式here和c ++参考指南here

的语法。