# Thread: I've been stuck at this for a while

1. ## I've been stuck at this for a while

The following program works when valid input is entered. When invalid input is entered it goes into a loop and stops working. I have included the code along with how I want the code to behave when invalid input is entered.

Code:
```#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_QUERIES 12
#define N_DIGITS 4

int isValid(int N){
//Create an array each index represent a digit
int digit[10]={0};
int lastDigit = 0;
//If Number is 4 digit

int lower = 1;
int upper = 9;
int x = 0;
for(;x<(N_DIGITS-1);x++){
upper=upper*10+9;
lower=lower*10;
}

if(N>=lower && N<upper){
//Iterate through each digit in N
while(N>0){
lastDigit = N%10;
//if digit is 0 then N is not valid
if(lastDigit==0)
return 0;
//if this digit is already seen then that means digit is repeated
if(digit[lastDigit]==1)
return 0;
//if not seen earlier then mark it as seen
digit[lastDigit]=1;
N=N/10;
}
return 1;
}
else
return 0;
}

//Choose a 4 digit valid number
int choose_N(){
int N=0;
while(1){
N = rand();
if(isValid(N))
return N;
}
return -1;
}

int matches(int N,int M){
int dN=0;
int dM=0;
int m=0;
while(N>0 && M>0){
dN=N%10;
dM=M%10;
//if both the last digit of N and M are same them increment the count of match
if(dN==dM)
m++;
N=N/10;
M=M/10;
}
return m;
}

int hits(int N,int M){
//Array to track what all digits are there in N
int digitsN[10]={0};
int lastDigit = 0;
int i=1;
int hit=0;

while(N>0){
lastDigit=N%10;
//index at lastDigit in digitsN is seen so adding the index from right side e.g 4920 has index as 4321
digitsN[lastDigit]=i++;
N=N/10;
}
i=1;

while(M>0){
lastDigit=M%10;
//Check if last digit of M is somewhere in the N but not at the same index
if(digitsN[lastDigit]!=0 && digitsN[lastDigit]!=i)
hit++;
M=M/10;
i++;
}
return hit;
}

int main(){
srand(time(0));
int N = choose_N();
//printf("Number guessed = %d\n",N);
printf("***Welcome to the MATCH and HIT game***\n");
printf("The computer has selected a 4-digit number.\n");
printf("Try to deduce it in 12 rounds of queries.\n");
int round=1;
int M=0;
int numOfInputRead=0;

while(round<=MAX_QUERIES){
printf("\nRound #%d\n",round);
while(numOfInputRead==0){
fflush(stdin);
printf("Please enter your query (4 digits):");
numOfInputRead = scanf("%d",&M);
if(numOfInputRead==1 && isValid(M)==1)
break;
else{
printf("Invalid number. Please try again!\n");
numOfInputRead=0;
}
}

numOfInputRead=0;
int m = matches(N,M);
int h = hits(N,M);
printf("\n-> %d match and %d hits ",m,h);

if(m==N_DIGITS){
printf("\n**********************************\n");
printf("CONGRATULATIONS! You won the game!\n");
printf("**********************************\n");
return 0;
}
round++;
}
printf("\n**********************************\n");
printf("Sorry, out of queries. Game over!\n");
printf("**********************************\n");
return 0;
}```

2. > fflush(stdin);
This doesn't do what you think it does. Remove it.

Code:
```if(numOfInputRead==1 && isValid(M)==1)
break;
else if (numOfInputRead == 0) {
printf("Invalid number. Please try again!\n");
// cleanup
int ch;
while ( (ch=getchar()) != EOF && ch != '\n' )
; // nothing to do
numOfInputRead=0;
} else {
// user signalled EOF by pressing ctrl-z or ctrl-d
}```

3. So, I did this and now it does not compile.

Code:
```#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_QUERIES 12
#define N_DIGITS 4

int isValid(int N){
//Create an array each index represent a digit
int digit[10]={0};
int lastDigit = 0;
//If Number is 4 digit

int lower = 1;
int upper = 9;
int x = 0;
for(;x<(N_DIGITS-1);x++){
upper=upper*10+9;
lower=lower*10;
}

if(N>=lower && N<upper){
//Iterate through each digit in N
while(N>0){
lastDigit = N%10;
//if digit is 0 then N is not valid
if(lastDigit==0)
return 0;
//if this digit is already seen then that means digit is repeated
if(digit[lastDigit]==1)
return 0;
//if not seen earlier then mark it as seen
digit[lastDigit]=1;
N=N/10;
}
return 1;
}
else
return 0;
}

//Choose a 4 digit valid number
int choose_N(){
int N=0;
while(1){
N = rand();
if(isValid(N))
return N;
}
return -1;
}

int matches(int N,int M){
int dN=0;
int dM=0;
int m=0;
while(N>0 && M>0){
dN=N%10;
dM=M%10;
//if both the last digit of N and M are same them increment the count of match
if(dN==dM)
m++;
N=N/10;
M=M/10;
}
return m;
}

int hits(int N,int M){
//Array to track what all digits are there in N
int digitsN[10]={0};
int lastDigit = 0;
int i=1;
int hit=0;

while(N>0){
lastDigit=N%10;
//index at lastDigit in digitsN is seen so adding the index from right side e.g 4920 has index as 4321
digitsN[lastDigit]=i++;
N=N/10;
}
i=1;

while(M>0){
lastDigit=M%10;
//Check if last digit of M is somewhere in the N but not at the same index
if(digitsN[lastDigit]!=0 && digitsN[lastDigit]!=i)
hit++;
M=M/10;
i++;
}
return hit;
}

int main(){
srand(time(0));
int N = choose_N();
//printf("Number guessed = %d\n",N);
printf("***Welcome to the MATCH and HIT game***\n");
printf("The computer has selected a 4-digit number.\n");
printf("Try to deduce it in 12 rounds of queries.\n");
int round=1;
int M=0;
int numOfInputRead=0;

while(round<=MAX_QUERIES){
printf("\nRound #%d\n",round);
while(numOfInputRead==0){
printf("Please enter your query (4 digits):");
numOfInputRead = scanf("%d",&M);
if(numOfInputRead==1 && isValid(M)==1)
break;
else if (numOfInputRead == 0)
{
printf("Invalid number. Please try again!\n");
int ch;
while ( (ch=getchar()) != EOF && ch != '\n' )
; // nothing to do
numOfInputRead=0;
}
else
{

}

}
}
}

numOfInputRead=0;
int m = matches(N,M);
int h = hits(N,M);
printf("\n-> %d match and %d hits ",m,h);

if(m==N_DIGITS){
printf("\n**********************************\n");
printf("CONGRATULATIONS! You won the game!\n");
printf("**********************************\n");
return 0;
}
round++;
}
printf("\n**********************************\n");
printf("Sorry, out of queries. Game over!\n");
printf("**********************************\n");
return 0;
}```

4. Well sloppy indentation means you lose track of where all the open / close braces are supposed to go.

Your 'main' really ends at line 126.
Figure out where your braces should be.
Code:
```#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_QUERIES 12
#define N_DIGITS 4

int isValid(int N)
{
//Create an array each index represent a digit
int digit[10] = { 0 };
int lastDigit = 0;
//If Number is 4 digit

int lower = 1;
int upper = 9;
int x = 0;
for (; x < (N_DIGITS - 1); x++) {
upper = upper * 10 + 9;
lower = lower * 10;
}

if (N >= lower && N < upper) {
//Iterate through each digit in N
while (N > 0) {
lastDigit = N % 10;
//if digit is 0 then N is not valid
if (lastDigit == 0)
return 0;
//if this digit is already seen then that means digit is repeated
if (digit[lastDigit] == 1)
return 0;
//if not seen earlier then mark it as seen
digit[lastDigit] = 1;
N = N / 10;
}
return 1;
} else
return 0;
}

//Choose a 4 digit valid number
int choose_N()
{
int N = 0;
while (1) {
N = rand();
if (isValid(N))
return N;
}
return -1;
}

int matches(int N, int M)
{
int dN = 0;
int dM = 0;
int m = 0;
while (N > 0 && M > 0) {
dN = N % 10;
dM = M % 10;
//if both the last digit of N and M are same them increment the count of match
if (dN == dM)
m++;
N = N / 10;
M = M / 10;
}
return m;
}

int hits(int N, int M)
{
//Array to track what all digits are there in N
int digitsN[10] = { 0 };
int lastDigit = 0;
int i = 1;
int hit = 0;

while (N > 0) {
lastDigit = N % 10;
//index at lastDigit in digitsN is seen so adding the index from right side e.g 4920 has index as 4321
digitsN[lastDigit] = i++;
N = N / 10;
}
i = 1;

while (M > 0) {
lastDigit = M % 10;
//Check if last digit of M is somewhere in the N but not at the same index
if (digitsN[lastDigit] != 0 && digitsN[lastDigit] != i)
hit++;
M = M / 10;
i++;
}
return hit;
}

int main()
{
srand(time(0));
int N = choose_N();
//printf("Number guessed = %d\n",N);
printf("***Welcome to the MATCH and HIT game***\n");
printf("The computer has selected a 4-digit number.\n");
printf("Try to deduce it in 12 rounds of queries.\n");
int round = 1;
int M = 0;
int numOfInputRead = 0;

while (round <= MAX_QUERIES) {
printf("\nRound #%d\n", round);
while (numOfInputRead == 0) {
printf("Please enter your query (4 digits):");
numOfInputRead = scanf("%d", &M);
if (numOfInputRead == 1 && isValid(M) == 1)
break;
else if (numOfInputRead == 0) {
printf("Invalid number. Please try again!\n");
int ch;
while ((ch = getchar()) != EOF && ch != '\n');  // nothing to do
numOfInputRead = 0;
} else {

}
}
}
}

numOfInputRead = 0;
int m = matches(N, M);
int h = hits(N, M);
printf("\n-> %d match and %d hits ", m, h);

if (m == N_DIGITS) {
printf("\n**********************************\n");
printf("CONGRATULATIONS! You won the game!\n");
printf("**********************************\n");
return 0;
}
round++;
}

printf("\n**********************************\n");
printf("Sorry, out of queries. Game over!\n");
printf("**********************************\n");
return 0;
}```

5. I'm sorry but I just cannot seem to find the error.

6. > I'm sorry but I just cannot seem to find the error.
You count each opening brace, and each closing brace.
When one isn't in a place you expect, you've found a problem.

You can do yourself a big favour by not trying to write so much code in main.
Eg.
Code:
```void introduction() {
printf("***Welcome to the MATCH and HIT game***\n");
printf("The computer has selected a 4-digit number.\n");
printf("Try to deduce it in 12 rounds of queries.\n");
}

int choose_M() {
int numOfInputRead, M;
while (numOfInputRead == 0) {
printf("Please enter your query (4 digits):");
numOfInputRead = scanf("%d", &M);
if (numOfInputRead == 1 && isValid(M) == 1)
break;
else if (numOfInputRead == 0) {
printf("Invalid number. Please try again!\n");
int ch;
while ((ch = getchar()) != EOF && ch != '\n');  // nothing to do
numOfInputRead = 0;
} else {

}
}
return M;
}

int main()
{
srand(time(0));
int N = choose_N();
//printf("Number guessed = %d\n",N);
int round = 1;
int M = 0;
int numOfInputRead = 0;

introduction();
while (round <= MAX_QUERIES) {
printf("\nRound #%d\n", round);
M = choose_M();
}
}```
Hopefully, you might see now how to add the rest of your code to main.

Popular pages Recent additions