+ 4
If the user inputs an invalid entry, how can I make it so that the program restarts and says something like "invalid entry try again"?
28 Answers
+ 5
I hope we can finish this 20 comment question once and for all, haha😁
This code works perfectly on both the code playground, and Visual Studio:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
string input() {
string b;
cin >> b;
int bLength = b.length();
for (int i = 0; i<bLength; i++) {
b.at(i) = tolower(b.at(i));
}
if (b != "rock" && b!= "paper" && b!="scissors") {
cout << "Invalid entry! Try again:\n";
input();
}
return b;
}
int main()
{
cout << "Rock, Paper, or Scissors?\n";
string b = input();
srand(time(0));
int a = 1 + (rand() % 3);
if (a == 1)
cout << "Rock\n";
else if (a == 2)
cout << "Paper\n";
else
cout << "Scissors\n";
if (b == "rock") {
if (a == 1)
cout << "It's a tie!\n";
else if (a == 2)
cout << "You lose\n";
else
cout << "You win\n";
}
if (b == "paper") {
if (a == 1)
cout << "You win\n";
else if (a == 2)
cout << "It's a tie\n";
else
cout << "You lose\n";
}
if (b == "scissors") {
if (a == 1)
cout << "You lose\n";
else if (a == 2)
cout << "You win\n";
else
cout << "It's a tie\n";
}
return 0;
}
+ 3
Use a recursive function.
Example:
#include <iostream>
int input()
{
int num;
std::cin >> num;
if (!(num >= 1 && num <= 10))
{
std::cout << "\nInvalid input! Try again: ";
input();
}
return num;
}
int main()
{
std::cout << "Input an integer between 1 and 10: ";
int num = input();
std::cout << "\nYou entered " << num << "!";
}
Note, that this won't work on the Code Playground, due to the awkward input system. But this would work on a proper IDE.
+ 3
The code didn't work in codeblocks either
+ 3
I FIXED IT! I have no idea whatever I just did means, but I DID IT!!!
+ 3
static just means it keeps its condition after something like a function has ended. With a non static function, variables will be destroyed when the function ends. With a static variable, that variable will not be destroyed. However at the end of the function, we are returning the string from input() to set it as the string from main(), so I think static is unnecessary.
As a beginner to C++ as well, I couldn't tell you what the purpose of the & is. I know it returns the memory address, but I would think that would be fairly unnecessary on a single function.
It worked for me without any of these, but if it works for you then congrats, it's finally done😂
+ 2
I wrote it but the recursive function just continues running even if I type a valid input
+ 2
It shouldn't do. Are you using the code that I wrote, or your own?
+ 2
My code, but I used yours as reference. Slightly different if statement and my input is a string
+ 2
Post it here if you could😁
+ 2
It's a rock, paper, scissors game btw
string input( ) {
string b;
cin >> b;
if ((b!="Rock"||b!="rock")||(b!="Paper"||
b!="paper) || (b!="Scissors || b!=
"scissors")) {
cout << "Invalid entry! Try again:\n";
input( );
}
return b;
}
int main ( )
{
cout<< "Rock, Paper, or Scissors?\n";
string b = input ( );
// rest of the code
}
If there's a way I can simplify the if statement, please let me know
+ 2
A couple things:
• As you know, strings are case sensitive, so I can see why you have made the if statement like that. You could build a for loop to convert the entire string to lower (or upper) case, to shorten that if statement:
int bLength = b.length();
//put this after you have input b, of course
for (int i = 0, i < bLength, i++)
b.at(i) = tolower(b.at(i));
tolower() and toupper() only works with characters, hence the for loop, and not: tolower(b).
• Use &&, not ||.
Lets say the user input paper, which is a valid input. Because you used the OR operator, it's checking whether string b is not scissors or rock. And because they are not, the if statement will evaluate to true. Hence why you should use AND operator in this situation.
Your final code:
string input( ) {
string b;
cin >> b;
int bLength = b.length();
for (int i = 0; i < bLength; b++)
b.at(i) = tolower(b.at(i));
if (b != "rock" && b != "scissors" && b != "paper") {
cout << "Invalid entry! Try again:\n";
input( );
}
return b;
}
int main ( )
{
cout<< "Rock, Paper, or Scissors?\n";
string b = input ( );
// rest of the code
}
+ 2
@Sainath keyword continue is used to skip to the next iteration of a loop. Won't be much help here.
+ 2
You're awesome! I should refer to you every time I have a doubt.
This fixed the continuous function problem, but now it created a problem with the other part of the code I didn't send you. The other part of the code is a few if statements and switch's that tells whether the user won or lost.
After the recursive function finishes, it's like the code now skips all those if statements and immediately returns 0 without letting the user know whether he won or lost
+ 2
Feel free to post that here too, can take a look☺
+ 2
After the recursive function (what you wrote), i have a truly random function that prints rock paper or scissors randomly to compete against the user. That part works fine.
Then I have the following:
if (b=="Rock" || b== "rock"){
switch (a) { // a=the random function
case 1:cout<<"It's a tie\n";
break;
case 2:cout<<"You lose\n";
break;
case 3:cour<<"You win\n";
break;
}
}
And two more of those with paper and scissors. I believe the problem may be in the if condition
+ 2
For the if statement, you should be able to just do
if (b == "rock")
Since we converted b to lowercase.
Switch statements are awkward things with strings in C++. It would be better to do if else statements in this situation:
if (b== "rock") {
if (a == "rock")
cout << "It's a tie\n";
else if (a == "paper")
cout << "You lose\n";
else
cout << "You win\n";
}
+ 2
It still "skips" it...
+ 2
Sorry for the late reply. As long as b is lowercase, like we did with the for loop, then that first if statement should evalutate to true.
Now it is comparing string a. As long as a is is also lowercase, and is of course a string, I don't see why else it would be skipping those outputs.
Post the whole code here that you have right now.
+ 2
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
string input(){
string b;
cin>>b;
int bLength=b.length();
for (int i=0; i<bLength; i++){
b.at(i)=tolower(b.at(i));
}
if (b!="rock && b!="paper"&& b!="scissors{
cout<<"Invalid entry! Try again:\n";
input();
}
return b;
}
int main()
{
cout<<"Rock, Paper, or Scissors?/n";
string b=input();
srand(time(0));
int a = 1 + (rand()%3);
if (a==1)
cout<<"Rock\n";
else if (a==2)
cout<<"Paper\n";
else
cout<<"Scissors\n";
if (b=="rock"){
if (a==1)
cout<<"It's a tie!";
else if (a==2)
cout<<"You lose";
else
cout<<"You win";
}
if (b=="paper"){
if (a==1)
cout<<"You win";
else if (a==2)
cout<<"It's a tie";
else
cout<<"You lose";
}
if (b=="scissors"){
if (a==1)
cout<<"You lose";
else if (a==2)
cout<<"You win";
else
cout<<"It's a tie";
}
return 0;
}
I think it's worth mentioning that it only started skipping after I included the recursive function AND it only skips after typing an invalid entry and the user retypes a valid entry.
+ 2
I run the code that you pasted on both the Code Playground and Visual Studio, and I have not been getting the problem you are getting.
All I changed were compiler errors that I got, and some mistypes that you may have made. For example, you have missed some semi-colons and the closing bracket on the input() function. Other than that, I changed not much else.
1) You enter rock, paper or scissors, non-case sensitive.
2) Program returns random: rock, paper or scissors.
3) Decides if you win or not.
If you are still getting problems, let me know. But I believe most of your problem is in that if statement.