C++ 如何验证用户在std::cin中输入的字符串?

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') {

students[]是结构和students[]的数组。name是结构中的一个字符串,我希望确保当用户输入名称时,它被验证为一个字母字符串

有人能告诉我一个简单的例子吗?完成这项工作的方法

我试过以下方法,但没有效果

        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;
}