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()
被替换,而=由于函数的逻辑相反,code>已更改为=
。描述的第一个问题是此函数属于一个类,但您忘记指定:
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()
被替换,而=由于函数的逻辑相反,code>已更改为=
(您可以像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处找到它之外,任何情况下都会返回trueisAlpha=text.find_first_of(digits,0)==std::string::npos代码>。我不知道OP到底不想要哪些字符,但如果所有这些字符都包括在内(或者改为做一个白名单),效果会很好。@chris:我的理解是,
的find\u first\u的第二个参数是搜索的起始位置,包括在内。另外,字符串中的第一个位置是零。是的,我指的是返回值。唯一的错误返回p