c++ - 如何对字符串变量应用验证,以便它只接受来自用户的字母数据?

标签 c++ io

我想让用户只输入字母数据,而不是任何数字或特殊字符数据。那么我该如何应用验证呢?例如,在下面的代码中,我希望用户输入姓名并且姓名不包含任何数字或特殊字符。我想让它只接受字母数据。

int main()
{
   string str;
   cout<<"Enter your name: ";
   cin>>str;
}

最佳答案

一种方法是使用ctype.hcctype
Functions to determine the type contained in character data

Ex: 它只接受alphabetic 甚至space

std::string ui; // user input
std::getline( std::cin, ui );

bool vi = true; // validate input
for( const char& chr : ui ){
    if( !std::isalpha( chr ) ){
        vi = false;
        break;
    }
}

if( vi ){
    std::cout << "okay\n";
} else {
    std::cout << "NOT!\n";
}

另一种是使用std::regex
Regular expressions library (C++11)

例如:同样

std::string ui; // user input
std::getline( std::cin, ui );

bool vi = true; // validate input

//    for( const char& chr : ui ){
//        if( !std::isalpha( chr ) ){
//            vi = false;
//            break;
//        }
//    }

vi = std::regex_match( ui, std::regex( "[A-Za-z]+" ) );

if( vi ){
    std::cout << "okay\n";
} else {
    std::cout << "NOT!\n";
}  

你可以根据这些函数找到你需要的或者使用regexes

isalnum  
isalpha
islower 
isupper 
isdigit 
isxdigit 
iscntrl 
isgraph
isspace 
isblank
isprint
ispunct

第三种方法可以使用 std::string::find

例如:

std::string ui; // user input
std::getline( std::cin, ui );

bool vi = true; // validate input

// find
// rfind
// find_first_of
// find_first_not_of
// find_last_of
// find_last_not_of

const char* not_valid_input = "!@#$%^&*()_+,.";
while( *not_valid_input ){

    if( ui.find( *not_valid_input ) < ui.size() ){
        vi = false;
        break;
    }

    ++not_valid_input;
}


if( vi ){
    std::cout << "okay\n";
} else {
    std::cout << "NOT!\n";
}

还有第四种方法可以使用 std::find_if,但是negate version

std::string ui; // user input
std::getline( std::cin, ui );

bool vi = true; // validate input

vi = std::find_if_not( ui.begin(), ui.end(), ::isalpha ) == ui.end();

if( vi ){
    std::cout << "okay\n";
} else {
    std::cout << "NOT!\n";
}

注意:EX: 中的 c++11 for 循环等同于:

for( unsigned index = 0; index < ui.size(); ++index ){
    if( !std::isalpha( ui[ index ] ) ){
        vi = false;
        break;
    }
}

关于c++ - 如何对字符串变量应用验证,以便它只接受来自用户的字母数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869717/

相关文章:

c - 使用 read() 和 write() 系统调用

c - Read() 尝试读取文件时卡住

c++ - Qt Creator 我无法在小部件属性面板中更改/找到 sizeHint

c++ - 如何在centos中的c中从IP获取以太网适配器名称

c++ - 具有 std::map 成员变量的类的下标运算符

java - 读取和写入日志文件

java - 动态优化线程数

.net - 在托管 C++ 中检测 Debug模式

c++ - 为什么递增/递减运算符破坏了递归功能

c - 套接字:为什么阻塞 read() 因 ENOTCONN 而失败?