C++ 字符串验证函数出错

C++ 字符串验证函数出错,c++,string,validation,C++,String,Validation,嘿,我正在验证一个字符串。基本上我希望它做的是防止用户输入字符串以外的任何内容。这是我的密码: **getString** string getString(string str) { string input; do { cout << str.c_str() << endl; cin >> input; } while(!isalpha(input)); return inp

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

**getString**

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

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;
    }
}
bool isAlpha=false;
而(!isAlpha){
//接收输入等等
isAlpha=真;
for(无符号i=0;i
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;
    }
}
bool isAlpha=false;
而(!isAlpha){
//接收输入等等
isAlpha=真;
for(无符号i=0;i
描述的第一个问题是此函数属于一个类,但您忘记指定:

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()
被替换,而
=已更改为
=

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

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{}一样使用(!ok(…);
)。

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

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

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

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


您可以输出一个字符串;您不必首先将其转换为C字符串。无论如何,我猜你忘了在它前面加上
验证器::
。整数、双精度、浮点等…
isalpha
接受字符,而不是浮点string@BeyondSora,从技术上讲是一个
int
@chris是的,我忘了前缀。但我仍然有一个错误,没有适当的转换。当(!isalpha(input))时,行上的变量输入;显示。您可以输出字符串;您不必首先将其转换为C字符串。无论如何,我猜你忘了在它前面加上
验证器::
。整数、双精度、浮点等…
isalpha
接受字符,而不是浮点string@BeyondSora,从技术上讲是一个
int
@chris是的,我忘了前缀。但我仍然有一个错误,没有适当的转换。当(!isalpha(input))时,行上的变量输入;显示了这一点。是的,对不起,应该现在修复。只是运行了更新的代码。它完全跳过了绳子。这是我在主屏幕上做的。是的,我不太明白。是的,对不起,现在应该被修复。只是用更新运行代码。它完全跳过了绳子。这是我在main cout中完成的方法是的,我不太明白。find-if-not有导入吗?@Pendo826,
find-if-not也是C++11的一部分,因此您需要使用适当版本的编译器和参数。使用C++03,我很确定使用
std::find_if
std::not1
包装
isalpha
会起作用。@chris我遇到了一个问题。当我使用这个cout@Pendo826运行代码时,你能发布一个小的、完整的导致这种情况发生的代码示例吗?我还添加了你帮助我使用的新函数。find-if-not有导入功能吗?@Pendo826,
find-if-not
也是C++11的一部分,因此,您需要使用适当版本的编译器和参数。使用C++03,我很确定使用
std::find_if
std::not1
包装
isalpha
会起作用。@chris我遇到了一个问题。当我使用这个cout@Pendo826运行代码时,您能发布一个小的、完整的代码示例吗?我还添加了您帮助过我的新函数。除了在位置0处找到它之外,任何情况下都会返回true
isAlpha=text.find_first_of(digits,0)==std::string::npos。我不知道OP到底不想要哪些字符,但如果所有这些字符都包括在内(或者改为做一个白名单),效果会很好。@chris:我的理解是,
find\u first\u的第二个参数是搜索的起始位置,包括在内。另外,字符串中的第一个位置是零。是的,我指的是返回值。唯一的错误返回p