Я очень новичок в этом мире 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;
}
Это работает очень хорошо для некорректного значения (ов), но не вырваться из петли на действительной записи. Любая идея, что мне здесь не хватает? Ура !!
ERRor из сценария Джеймса 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()
и проверки в виде строки Спасибо всем (особенно Джеймс 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;
}
}
Есть ли там какое-нибудь место для улучшения? Ура !!
@Shahbaz Я всегда знал, что мой C++ безнадежна, но не знал, что пошел так далеко! – MacUsers
Речь идет не о вашем коде, а о вашем названии вопроса как-то напомнил мне об этом смешном, что я видел однажды! – Shahbaz