字符串验证函数出错

Error with string validation function

本文关键字:出错 函数 验证 字符串      更新时间:2023-10-16

嘿,我试图验证一个字符串。 基本上,我希望它做的是防止用户输入字符串以外的任何内容。 这是我的代码:

**getString**
string getString(string str)
{
    string input;
    do
    {
        cout << str.c_str() << endl;
        cin >> input;
    }
    while(!isalpha(input));
    return input;
}

错误

Error   2   error LNK2019: unresolved external symbol "public: bool __thiscall Validator::getString(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?getString@Validator@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: void __thiscall Player::information(void)" (?information@Player@@QAEXXZ)    C:UsersConorDocumentsCollegeDKIT - Year 2 - RepeatDKIT - Year 2 - Semester 1 - RepeatGames ProgrammingMaroonedCA2MaroonedCA2Player.obj    MaroonedCA2
Error   3   error LNK1120: 1 unresolved externals   C:UsersConorDocumentsCollegeDKIT - Year 2 - RepeatDKIT - Year 2 - Semester 1 - RepeatGames ProgrammingMaroonedCA2DebugMaroonedCA2.exe MaroonedCA2
    4   IntelliSense: no suitable conversion function from "std::string" to "int" exists    c:UsersConorDocumentsCollegeDKIT - Year 2 - RepeatDKIT - Year 2 - Semester 1 - RepeatGames ProgrammingMaroonedCA2MaroonedCA2Validator.cpp 72  17  MaroonedCA2

主要

cout << "What is your name ?n";
    name = validator.getString();<------This skips.
    cout << "nWhat is your age? ";
    age = validator.getNum();
    string character = "What is your sex M/F?";
    sex = validator.getChar(character);

    cout <<"Name:n"<< name<<" Age:n" << age<< " Sex:n"<< sex <<"n";

新的 getString 函数。

string Validator :: getString()
{
   string input;
    do 
    {
    } 
    while (
    std::find_if_not( 
        std::begin(input), //from beginning
        std::end(input), //to end
        isalpha //check for non-alpha characters
    ) != std::end(input) //continue if non-alpha character is found
);
    return input;
}

描述的第一个问题是此函数属于一个类,但您忘记指定:

string Validator::getString(string str)
       ^^^^^^^^^^^

接下来,isalpha需要int(由于 C 原因),据我所知,没有std::string的版本。但是,您可以使用标准算法来执行此操作:

do {
    ...
} while (
    std::find_if_not( 
        std::begin(input), //from beginning
        std::end(input), //to end
        isalpha //check for non-alpha characters
    ) != std::end(input) //continue if non-alpha character is found
);

find_if_not调用将搜索字符串,并通过将返回值与字符串的结束迭代器进行比较来检查是否找到任何非字母字符。如果它们相等,则字符串是干净的。您可能还必须强制转换isalpha因为它期望谓词采用char,而不是int

有关使用此算法的一些示例,请参阅此处。请注意,由于那里的 GCC 版本,std::begin()std::end() 被替换,并且由于函数的逻辑相反,!=更改为 ==(你会像do {} while (!ok(...));一样使用它)。

isalpha接受整数而不是字符串。

确保字符串中的每个字符都是字母的一种方法是执行类似操作。

bool isAlpha = false;
while (!isAlpha) {
// take in input blah blah

    isAlpha = true;
    for (unsigned i = 0; i < input.length(); ++i) {
      if (!isalpha(input[i]))
          isAlpha = false;
    }
}

更有效的方法是使用 std::string 函数在字符串中搜索数字:

static const char digits[] = "0123456789";
isAlpha = text.find_first_of(digits, 0); // start from position 0.