C++ 如何验证用户在std::cin中输入的字符串?
students[]是结构和students[]的数组。name是结构中的一个字符串,我希望确保当用户输入名称时,它被验证为一个字母字符串 有人能告诉我一个简单的例子吗?完成这项工作的方法 我试过以下方法,但没有效果C++ 如何验证用户在std::cin中输入的字符串?,c++,c++11,visual-c++,C++,C++11,Visual C++,students[]是结构和students[]的数组。name是结构中的一个字符串,我希望确保当用户输入名称时,它被验证为一个字母字符串 有人能告诉我一个简单的例子吗?完成这项工作的方法 我试过以下方法,但没有效果 bool checkString(const char *str) { bool isLetters = true; while (*str != '\0') {
bool checkString(const char *str)
{
bool isLetters = true;
while (*str != '\0')
{
if (*str < '65' || *str > '122')
{
//checking to see if it's over or below ASCII alpha characters
isLetters = false;
}
if (*str < '97' && *str > '90')
{
// checking to see if it's between capital and
//lowercase alpha char's
isLetters = false;
}
++str;
}
return isLetters;
}
main
{
//...
for (int i = 0; i < numStudents; ++i)
{
valid = true;
do
{
valid = true;
cout << "Enter NAME for student #" << i + 1 << ":" << endl;
cin >> students[i].name;
if (cin.fail() || !checkString(students[i].name.c_str()))
// tried to see if i could convert it to a c-style
//string to check char by char
{
cin.clear();
cin.ignore();
cout << "Please enter a valid input." << endl;
valid = false;
}
} while (!valid);
//...
return 0;
}
`
您必须使用ascii值检查每个字符是否为字母表
bool checkString(string stdunt)
{
bool isLetters = true;
for (int i = 0; i < stdunt.length(); i++)
{
if (stdunt[i] < 65 || stdunt[i] > 122)
{ return false; }
if (stdunt[i] < 97 && stdunt[i] > 90)
{ return false; }
}
return isLetters;
}
int main()
{
int numStudents=5;
string students[numStudents];
for (int i = 0; i < numStudents; i++)
{
bool valid = true;
do{
valid = true;
cout << "Enter NAME for student #" << i + 1 << ":" << endl;
cin >> students[i];
// cout <<students[i];
if (cin.fail() || !checkString(students[i]))
{
cin.clear();
cin.ignore();
cout << "Please enter a valid input." << endl;
valid = false;
}
} while (!valid);
}
cout << "Complete";
return 0;
}
`
ASCII码是整数,不要用引号括起来
bool checkString(const char *str)
{
bool isLetters = true;
while (*str != '\0')
{
if (*str < 65 || *str > 122)
{
//checking to see if it's over or below ASCII alpha characters
isLetters = false;
}
if (*str < 97 && *str > 90)
{
// checking to see if it's between capital and
//lowercase alpha char's
isLetters = false;
}
++str;
}
return isLetters;
}
然后,当你意识到这不是一封信时,你可以立即返回,没有必要继续检查
#include <cctype>
bool checkString(const char *str)
{
while (*str != '\0')
{
if (!isalpha(*str)))
return false;
++str;
}
return true;
}
在cin中只能输入字符串。不过,这个字符串可能会被解析成其他的东西,比如int或double。哦,我明白了,如果只是为了个人的满足,那么这可能会比它的价值大得多,因为我能看到真正做到这一点的唯一方法是通过广泛的切换statements@MicahJohnson可以使用函数isalpha和循环来实现。isalpha测试一个字符是否为字母。你也可以用一个更简单的正则表达式来完成它。@john可能不属于我的范围,但当我在学习中遇到这些术语时,我会记住这一点。谢谢“65”和“122”是什么意思?测试是否小于字符*str<'A',或者小于整数值*str<65。不是“65”,它是一个多字符常量,也不是您想要的。更好的是,不要像下面的答案那样使用ASCII和isalpha。只是编辑代码试图这样做,没有运气。只是编辑了答案,希望它是你想要的。如果字符串大小未知,则可以使用指针。由于这是在处理来自程序外部的不受信任的输入,因此需要使用isalphaunsigned char*str,否则,如果输入包含范围[0127]之外的值且char已签名,则会出现未定义的行为。严格来说,如果您包含,您应该使用std::isalpha或添加一个using声明,或者使用include。谢谢,这很有效。我觉得自己很傻,因为我没有试着把它们从报价中去掉。但总的来说,isalpha要简单得多。
#include <cctype>
bool checkString(const char *str)
{
while (*str != '\0')
{
if (!isalpha(*str)))
return false;
++str;
}
return true;
}