gpt4 book ai didi

c++ - 数字输入的输入验证

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:06 24 4
gpt4 key购买 nike

我是这个 C++ 世界的新手,正在尝试为数字密码编写一个输入验证函数。这是我到目前为止得到的:

#include <iostream>
#include <limits>
using namespace std;

void isNumeric(int &iN)
{
while (1) {
cin >> iN;

if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Only 'numeric' value(s) are allowed: ";
continue;
}

// alpha-numeric entry also not allowed
cin.ignore(numeric_limits<streamsize>::max(), '\n');
if (cin.gcount() > 1) continue;

// check against the -ve value
if (iN <= 0 ) continue;

break;
}
}

int main()
{
int x;

cout << "Enter your number: ";
isNumeric(x);
cout << "You've entered: " << x << endl;

return 0;
}

它对不正确的值工作得很好,但不会在有效输入时跳出循环。知道我在这里缺少什么吗?干杯!


James Kanze 脚本中的错误:

test.cpp: In function ‘bool parseNumber(const string&, int&)’:
test.cpp:11:20: error: no match for ‘operator>>’ in ‘text >> results’
test.cpp:11:20: note: candidates are:
/usr/include/c++/4.6/bits/basic_string.tcc:998:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&)
/usr/include/c++/4.6/bits/istream.tcc:957:5: note: template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)
/usr/include/c++/4.6/bits/istream.tcc:925:5: note: template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)
/usr/include/c++/4.6/istream:709:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)
/usr/include/c++/4.6/istream:714:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&)
/usr/include/c++/4.6/istream:756:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)
/usr/include/c++/4.6/istream:761:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*)
test.cpp:11:42: error: ‘const string’ has no member named ‘peek’
test.cpp:11:52: error: ‘EOF’ was not declared in this scope


新代码: 使用 getline()字符串验证感谢大家(尤其是 James Kanze)帮助我。这东西在这里很管用。

void isNumeric( int &iN )
{
string sN;

while (1) {
getline(cin, sN);

bool valNum = true;
for ( unsigned iDx=0; iDx < sN.length(); iDx++ )
if ( !isdigit(sN[iDx]) ) {
valNum = false;
break;
}

if ( !valNum ) {
cout << "Wrong entry; Try again: ";
continue;
}

stringstream sStream (sN );
sStream >> iN;

if ( iN<=0 ) {
cout << "Cannot be 0; Try again: ";
continue;
}
break;
}
}

还有改进的余地吗?干杯!!

最佳答案

这看起来像是面向行的输入。在这种情况下,通常的解决方案就是使用getline:

bool parseNumber( std::string const& text, int& results )
{
std::istringstream parser( text );
return parser >> results >> std::ws && parser.peek() == EOF;
}

int getNumber()
{
int results;
std::string line;
while ( ! std::getline( std::cin, line ) || ! parseNumber( line, results ) )
{
std::cin.clear();
std::cout << "Only 'numeric' value(s) allowed:";
}
return results;
}

关于c++ - 数字输入的输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com