我基本上期待一个数字作为输入。由于我知道我的其他循环工作正常,因此数量可以忽略不计。但测试一下这个数字是否有点棘手。我只想再次调用该函数,如果用户输入的是字母数字或简单的单词,则重新开始。或者按下回车键。不是数字的东西。我试过了!因为我正在输入int numTemp
,但这只会导致无限循环,无数次地溢出"what is the bitrate"
。谁知道我做错了什么?我尝试将cin.clear()
和cin.ignore(100, "\n")
放在第一个if语句中,但无济于事。提前致谢。
bool iTunes::setBitRate()
{
cout << "What is the bitrate? ";
int numTemp;
cin >> numTemp;
if (!cin)
{
cout << "WRONG" << endl;
setBitRate();
}
else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
{
cout << "Bit Rate out of range" << endl;
setBitRate();
}
else
{
bitRate = numTemp;
}
}
答案 0 :(得分:0)
您只需从用户而不是int中读取字符串,然后检查它并在不喜欢字符串时提示输入新内容(例如,如果它没有干净地转换为数字,您可以查看strtol
)。
答案 1 :(得分:0)
如果要检查输入是数字还是字符,可以使用isdigit
,但必须将char
传递给它,然后当它是数字时,您可以将其转换为一个int
atoi
。
答案 2 :(得分:0)
当语句cin >> numTemp
由于非数字输入而失败时,导致失败的字符从输入流中删除 NOT 。因此,下次调用流提取运算符时,它将看到与上次相同的非数字输入。为避免这种情况,您需要跳过现有输入。
这样做的一种方法是在尝试将文本转换为整数之前使用getline()
来读取完整的文本行。以下代码段说明了这一点:
#include <cstdlib>
bool getint(istream& in, int & out) {
string line;
getline(in, line);
char* endptr;
out = strtol(line.c_str(), &endptr, 10);
return endptr!=line.c_str();
}
bool iTunes::setBitRate()
{
cout << "What is the bitrate? ";
int numTemp;
if ( !getint(cin, numTemp) && cin )
{
cout << "WRONG" << endl;
setBitRate();
}
else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
{
cout << "Bit Rate out of range" << endl;
setBitRate();
}
else
{
bitRate = numTemp;
}
}
注意:您还应该在每次读取后检查cin的状态,以确保没有发生某些错误。
答案 3 :(得分:-2)
我认为这会有所帮助
bool iTunes::setBitRate()
{
cout << "What is the bitrate? ";
int numTemp = 0;
cin >> numTemp;
if (!numTemp)
{
cout << "WRONG" << endl;
setBitRate();
}
else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
{
cout << "Bit Rate out of range" << endl;
setBitRate();
}
else
{
bitRate = numTemp;
}
}