如果遇到错误,irepeat代码如何?
问题描述:
我需要做一个猜测的基本游戏,不知道如何循环代码,以便用户在遇到错误时再次输入他的答案。这是整个代码,我已经写了:如果遇到错误,irepeat代码如何?
#include <iostream>
#include <stdlib.h> //srand
#include <time.h> // time
#include <vector>
#include <stdexcept>
void error(std::string s)
{
throw std::runtime_error(s);
}
int main()
{
int characters ,length ,guess_number = 0,letter_number = 0, total_guess = 0 , err_count = 0;
char letters,guess;
std::vector <char> v;
std::vector <char> answer;
std::cout << "Enter the amount of different characters: ";
std::cin >> characters;
std::cout << "Enter the pattern length ";
std::cin >> length;
if(length > 26)
{
error("Length can't be over 26");
}
srand (time(NULL));
for(int i =0; i < length ; i++)
{
letters = rand()% (26-(26-characters))+65; //ascii code for Upper case letters. we discard the 26-characters to only generate random numbers up until how many characters.
letter_number++;
v.push_back(letters); //random letters
}
for(int i = 0;i <v.size(); i++)
std::cout << v[i];
try
{
while(guess_number != letter_number)
{
std::cout << "Enter your guess: ";
while(std::cin >> guess)
{
answer.push_back(guess); //user guess
if (std::cin.peek() == '\n')
break;
}
total_guess ++;
if(v.size() != answer.size())
{
error("Answer too short");
}
for(int i = 0; i < v.size(); i++)
{
if(v[i] == answer[i])
{
guess_number++;
}
}
if(guess_number != letter_number)
{
std::cout << "you have guessed " << guess_number << " characters correctly." << std::endl;
guess_number = 0;
answer = {};
}
else if(guess_number == letter_number)
{
std::cout << "You have guessed " << guess_number << " characters correctly" << std::endl;
std::cout << "You guesses the pattern in " << total_guess << " guesses";
break;
}
}
}
catch(std::runtime_error& error)
{
std::cerr << "error: "<< error.what() << std::endl;
return 1;
}
return 0;
}
基本上我不知道如何使程序如果用户输入比随机字母矢量较短的回答再次询问用户。在这部分之后:
if(v.size() != answer.size())
{
error("Answer too short");
}
当我运行它并输入短的内容时,程序会给出错误并结束而不是再次执行。
答
您的代码失败,因为一旦错误被触发,您正在捕获错误(在while
循环之外,基本上终止它),然后甚至执行return 1
(终止程序)。另外,由于错误可能会提前停止执行,因此在开始每个步骤后,您应该始终清除answer
。所以,你应该做三两件事:
- 包裹内
while
- 的
try...catch
卸下渔获的return 1
线,所以代码会继续执行 - 移动
answer = {};
到的try...catch
它应该看起来像这样:
while(guess_number != letter_number)
{
try
{
answer = {};
std::cout << "Enter your guess: ";
while(std::cin >> guess)
{
answer.push_back(guess); //user guess
if (std::cin.peek() == '\n')
break;
}
total_guess ++;
if(v.size() != answer.size())
{
error("Answer too short");
}
for(int i = 0; i < v.size(); i++)
{
if(v[i] == answer[i])
{
guess_number++;
}
}
if(guess_number != letter_number)
{
std::cout << "you have guessed " << guess_number << " characters correctly." << std::endl;
guess_number = 0;
}
else if(guess_number == letter_number)
{
std::cout << "You have guessed " << guess_number << " characters correctly" << std::endl;
std::cout << "You guesses the pattern in " << total_guess << " guesses";
break;
}
}
catch(std::runtime_error& error)
{
std::cerr << "error: "<< error.what() << std::endl;
}
}
在这里你去:tio.run注:我改变你的代码总是 “产生” AB为图案
你怎么样只是[*'continue' *](http://en.cppreference.com/ w/cpp/language/continue)循环? –
如果用户输入的字符太少,它真的是一个例外吗?我的意思是,这不是特别的情况吗?你如何维护一个表示他们的答案是否太短的标志呢? 然后在你的while循环中检查标志(如果用户回答太短,那么只需循环,抛出错误只需将标志设置为true,否则将其设置为false)。 –
或者像刚才说的一些程序员家伙一样,如果答案太短,继续跳回循环的开始。 –