正如问题所说,出于某种原因,我的程序没有刷新输入或使用我目前无法识别的变量。这是一个家庭作业项目,我已经超越了我必须做的事情,现在我只是希望程序实际工作:P
让发现更容易的详细信息:
程序在第一次运行时执行完美。所有抛出都有效,只接受正确的值(n> 0)并变成二进制。
一旦我输入终止输入,程序就进入一个循环,只会再次请求终止:
当我在Linux笔记本电脑上在Netbeans上运行此程序时,程序在输入终止值后崩溃。在Windows上的Visual C ++上,它就像刚刚描述的那样进入循环。
在代码中,我试图清除每个流并在程序重新启动时初始化每个变量new,但无济于事。我只是看不出自己的错误。
我认为错误在于主要功能:
int main( void )
{
vector<int> store;
int terminate = 1;
do
{
int num = 0;
string input = "";
if( cin.fail() )
{
cin.clear();
cin.ignore( numeric_limits<streamsize>::max(), '\n' );
}
cout << "Please enter a natural number." << endl;
readLine( input, num );
cout << "\nThank you. Number is being processed..." << endl;
workNum( num, store );
line;
cout << "Go again? 0 to terminate." << endl;
cin >> terminate // No checking yet, just want it to work!
cin.clear();
}while( terminate );
cin.get();
return 0;
}
或在读取数字的函数中:
void readLine( string &input, int &num )
{
int buf = 1;
stringstream ss;
vec_sz size;
if( ss.fail() )
{
ss.clear();
ss.ignore( numeric_limits<streamsize>::max(), '\n' );
}
if( getline( cin, input ) )
{
size = input.size();
for( int loop = 0; loop < size; ++loop )
if( isalpha( input[loop] ) )
throw domain_error( "Invalid Input." );
ss << input;
ss >> buf;
if( buf <= 0 )
throw domain_error( "Invalid Input." );
num = buf;
ss.clear();
}
}
答案 0 :(得分:2)
当您调用cin >> terminate
时,它将读取terminate的值,但在输入流中保留新行。当你致电getline(cin, input)
时,它会读到换行符,这意味着它会得到一个空字符串。
您可以在cin >> terminate
:
cin.ignore(99, '\n');
或者避免混合operator >>
和getline
。
答案 1 :(得分:2)
不要将这些>>
和getline
运营商混为一体。
此外,如果您想清除您的代码,我认为它可以通过以下方式重写:
int main() {
while (true) {
std::cout << "Please enter a natural number" << std::endl;
int num;
std::cin >> num;
// Exception handling here can be done easily
// like this
// if (!(std::cin >> num) || num < 0)
// throw std::domain_error("TROLOLOLO");
std::cout << "Thank you. Number is being processed..." << std::endl;
//workNum(num, store) here
std::cout << "Go again? 0 to terminate." << std::endl;
int terminate;
std::cin >> terminate;
if (terminate == 0) break;
}
}