如何对字符串变量应用验证,使其仅接受来自用户的字母数据?
How to apply validation on a string variable so that it accept only alphabetic data from the user?
我想让用户只输入字母数据,而不是任何数字或特殊字符数据。那么如何应用验证呢?例如,在下面的代码中,我希望用户输入名称,并且名称不包含任何数字或特殊字符。我想让它只接受字母数据。
int main()
{
string str;
cout<<"Enter your name: ";
cin>>str;
}
一种方法是使用ctype.h
或cctype
函数来确定字符数据中包含的类型
例如:它只接受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 << "okayn";
} else {
std::cout << "NOT!n";
}
另一种是使用std::regex
正则表达式库(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 << "okayn";
} 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 << "okayn";
} else {
std::cout << "NOT!n";
}
第四种方式也可以是使用std::find_if
,但否定版本
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 << "okayn";
} 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;
}
}
通常认为,只要循环可以被命名良好的算法替换,就避免使用循环。参见肖恩·帕伦特(Sean Parent(的口头禅"没有原始循环"的演讲。
在这里一种方法是使用std::all_of
,它会检查字符串,并在谓词返回 false 时立即停止循环。
#include <cctype>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cout << "enter a string using only characters from the alphabet.n";
cin >> s;
if(all_of(begin(s), end(s), ::isalpha))
cout << "all ok!!n";
else
cout << "the string contains some non alpha characters.n";
}
all_of
是 C++11 及更高版本(我们真的还需要添加免责声明吗(,但是如果您没有可用的标准库实现,则实现该函数是微不足道的。
另请注意,这使用cin
因此,如果行包含它们,则仅读取第一个空格。如果您想阅读整行使用std::getline
相关文章:
- C++Lua用户数据扰乱了Mathfu浮点值
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 如何在C++中将用户数据从一个 Lua 块传递到另一个块
- 如何索引转换后的用户数据值?
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 用于在C++中计算用户数据的线程
- 如何验证文件中.txt用户数据?C++
- Lua 用户数据生命周期管理
- 如何将每线程用户数据传递到ASIO处理程序中
- C++ LuaBridge 尝试索引用户数据值(本地"self")
- C /LUA FFI将用户数据作为表格
- 加密用户数据,而不会丢失安卓应用程序中的登录用户
- 如何为Qwidget设置用户数据
- 如何在用户数据中存储值类型
- Lua:为自定义用户数据提供一个字符串方法
- 如何使用发送消息功能发送用户数据
- 使用luac API从表中提取用户数据
- 带有字符串抛出bad_alloc用户数据的 curl 写入回调
- 对用户数据进行严格的别名和回调