我的代码遇到了一些问题,这是我遇到问题的代码的一部分。
此代码的一点是,如果用户输入的内容不是数字,例如字符p
,程序应该要求用户再次输入,此部分可以正常工作。
如果用户输入数字和字符的组合,程序应该要求用户再次输入。例如,n12
或12n
无效。
角色首先出现的部分,如n12
不会导致问题,但问题出现在数字是第一个而其他第二个,如12n
,这是无效的,但我的代码打印出数字12
,后来表示该数字无效。
#include <iostream>
using namespace std;
int main ()
{
int n;
while(1)
{
cout<<"Enter a number, 0 for exit: ";
cin>>n;
if(!cin)
{
cout<<"You didnt enter a valid number\n";
cin.clear();
cin.ignore(1000,'\n');
continue;
}
cout<<"Number is: "<<n<<endl;
if(n==0) return 0;
}
}
代码输出示例:
1°
Enter a number, 0 for exit: 12
Number is: 12
2°
Enter a number, 0 for exit: n
You didnt enter valid number
3°
Enter a number, 0 for exit: n12
You didnt enter valid number
4°&lt; ---这个不能正常工作
Enter a number, 0 for exit: 12n
Number is: 12
Enter a number, 0 for exit: You didnt enter valid number
编辑:如果可能的话,我想解决这个问题而不包括额外的库。
答案 0 :(得分:4)
您可以使用其他标准库中的isdigit(),std::string和std::all_of()(这没关系,而不是过度杀伤),就像这样(您将输入存储在字符串中,然后您检查对于该字符串的每个字符,isdigit函数是否成功,这意味着在这种情况下输入纯粹是数字的):
#include <iostream>
#include <cctype>
#include <string>
int main()
{
std::string str;
std::cin >> str;
(std::all_of(str.begin(), str.end(), [] (char c) { return isdigit(c); })) ? std::cout << "It's a number!\n" : std::cout << "isdigit() failed\n";
return 0;
}
输出:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
4
It's a number!
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
f
isdigit() failed
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
12n
isdigit() failed
答案 1 :(得分:1)
您需要检查用户输入的整行,而不仅仅是其中的一部分。 istream::operator>>
遇到不属于当前正在读取的数据类型的字符时停止读取。这就是12n
之类的输入分别作为12
和n
处理的原因。
您不会仅使用<iostream>
功能解决此问题。最好使用std::getline()
和std::stoi()
/ std::strtol()
等内容处理,例如:
#include <iostream>
#include <string>
using namespace std;
bool to_int(const string &str, int &i)
{
size_t pos;
i = stoi(str, &pos);
return (str.c_str()[pos] == '\0');
}
int main ()
{
string line;
int n;
do
{
cout << "Enter a number, 0 for exit: ";
getline(cin, line);
if (!to_int(line, n))
{
cout << "You didn't enter a valid number\n";
continue;
}
cout << "Number is: " << n << endl;
if (n == 0) break;
}
while (1);
return 0;
}
如果您不想使用std::stoi()
之类的转换功能,请至少使用std::istringstream
:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool to_int(const string &str, int &i)
{
char c;
istringstream iss(str);
iss >> i;
return !(iss.fail() || iss.get(c));
}
int main ()
{
string line;
int n;
do
{
cout << "Enter a number, 0 for exit: ";
getline(cin, line);
if (!to_int(line, n))
{
cout << "You didn't enter a valid number\n";
continue;
}
cout << "Number is: " << n << endl;
if (n == 0) break;
}
while (1);
return 0;
}
答案 2 :(得分:0)
循环显示数字,如果它有数字以外的内容,则打印“你没有输入有效数字”,否则打印数字。我们将以字符串形式输入并使用ctype.h来验证字符串的字符是否为数字:
#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
string n;
bool is_valid = true;
while (1)
{
cout << "Enter a number, 0 for exit: ";
cin >> n;
for (size_t i = 0; i < n.length(); i++) {
if (!isdigit(n[i])) {
cout << "You didnt enter a valid number\n";
is_valid = false;
break;
}
}
if (is_valid) cout << "Number is: " << n << endl;
if (n == "0") return 0;
}
}