The program control flow doesn't work as expected - c

This is a problem in C. The program Control flow is not as expected. It ask to enter the character in but fail to ask to enter character x.
int foo();
int main(int argc, const char * argv[]) {
foo();
return 0;
}
int foo(){
char in;
char x;
printf("Do you wanna party \n");
if((in = getchar()) == 'y')
printf("Go Sleep!, I was kidding\n");
else
printf("Oh! you are so boaring..\n");
printf("\nOk, Another Question\n");
printf("Wanna Go to Sleep\n");
if((x = getchar()) == 'y')
printf("ok lets go, Sleepy Head\n");
else
printf("No, lets go\n");
return 0;
}

To clarify the comments mentioned above, in the process of giving input, you're pressing Y and then pressing ENTER. So, the y is considered as the input to first getchar(), and the ENTER key press [\n] is stored in the input buffer.
On the call to next getchar(), the \n is read, which is considered a perfectly valid input for getchar() and hence your code is not waiting for the next input.

Related

How to take input until enter is pressed twice?

I want to break this loop when the user press enters twice. Meaning, if the user does not enter a character the second time, but only presses enter again, the loop must break.
char ch;
while(1) {
scanf("%c",&ch);
if(ch=='') { // I don't know what needs to be in this condition
break;
}
}
It is not possible to detect keypresses directly in C, as the standard I/O functions are meant for use in a terminal, instead of responding to the keyboard directly. Instead, you may use a library such as ncurses.
However, sticking to plain C, we can detect newline characters. If we keep track of the last two read characters, we can achieve similar behavior which may be good enough for your use-case:
#include <stdio.h>
int main(void)
{
int currentChar;
int previousChar = '\0';
while ((currentChar = getchar()) != EOF)
{
if (previousChar == '\n' && currentChar == '\n')
{
printf("Two newlines. Exit.\n");
break;
}
if (currentChar != '\n')
printf("Current char: %c\n", currentChar);
previousChar = currentChar;
}
}
Edit: It appears that the goal is not so much to detect two enters, but to have the user:
enter a value followed by a return, or
enter return without entering a value, after which the program should exit.
A more general solution, which can also e.g. read integers, can be constructed as follows:
#include <stdio.h>
#define BUFFER_SIZE 64U
int main(void)
{
char lineBuffer[BUFFER_SIZE];
while (fgets(lineBuffer, BUFFER_SIZE, stdin) != NULL)
{
if (lineBuffer[0] == '\n')
{
printf("Exit.\n");
break;
}
int n;
if (sscanf(lineBuffer, "%d", &n) == 1)
printf("Read integer: %d\n", n);
else
printf("Did not read an integer\n");
}
}
Note that there is now a maximum line length. This is OK for reading a single integer, but may not work for parsing longer input.
Credits: chux - Reinstate Monica for suggesting the use of int types and checking for EOF in the first code snippet.
You can store the previous character and compare it with the current character and enter, like this:
char ch = 'a', prevch = '\n';
while(1){
scanf("%c",&ch);
if((ch=='\n') && (ch == prevch)){// don't know what needs to be in this condition
break;
}
prevch = c;
}
Note that the previous character by default is enter, because we want the program to stop if the user hits enter at the very start as well.
Working like charm now
char ch[10];
while(1){
fgets(ch, sizeof ch, stdin);
if(ch[0]=='\n'){
break;
}
}

How to fix - unexpected output using getchar() and do-while

I am trying to make a simple code that will read a char from input and execute "Correct" or "Incorrect input" and run the code again until the correct input is entered. First of all it does not work for capital X. The other issue that I want to fix is that after the incorrect input I have to press enter to get the "Enter x" message, instead of getting in immediately after the incorrect input message.
#include <stdio.h>
int main()
{
do
{
printf("Enter x\n");
if (getchar()=='x'|| getchar()=='X')
{
printf("Entered char is X\n");
return 0;
}
else
{
printf("Input incorrect! Please try again!!!\n");
}
}
while (getchar()!='x' || getchar()!='X');
return 0;
}
You need to store the input in a variable, otherwise you keep asking for input several times in a row, for each getchar call.
For weird historic reasons, getchar actually returns an int, since the value EOF that can be returned from it is an int. So the variable must be int.
And finally, each time the user hits enter, a invisible line feed character \n is appended to the input stream. This character does you no good, so you should discard it with an extra read.
#include <stdio.h>
int main (void)
{
int input;
do
{
printf("Enter x\n");
input = getchar();
getchar(); // extra getchar to chew up line feed from stdin
if (input=='x'|| input=='X')
{
printf("Entered char is X\n");
}
else
{
printf("Input incorrect! Please try again!!!\n");
}
} while (input!='x' && input!='X');
return 0;
}
Please note that the opposite of input=='x'|| input=='X' is input!='x' && input!='X' (De Morgan's laws). "If input is not 'x' and input is not 'X' then loop".
When you hit the ENTER key the newline character \n is placed in input buffer. You need to consume that newline character in order to read the next character.
Also you are reading two time, which is unnecessary in this case. So your code should be like this
#include <stdio.h>
int main()
{
char inp;
do
{
printf("Enter x\n");
inp = getchar();
getchar(); // reading the newline character '\n'
if (inp == 'x'|| inp =='X')
{
printf("Entered char is X\n");
return 0;
}
else
{
printf("Input incorrect! Please try again!!!\n");
}
}
while (inp !='x' || inp !='X');
return 0;
}
p.s There is no need to put condition checking in while loop, since you are returning in if condition. while(true) would work fine. Thanks #bruno for pointing that out.
In your code:
if (getchar()=='x'|| getchar()=='X')
getchar() is called twice.
Instead, you should write it this way:
char c = getchar();
if (c=='x'|| c=='X')
for the second part, if your goal is print the message on a new line, then just simply change your printf to:
printf("\nInput incorrect! Please try again!!!\n");

Implementing getch() functionality by using either fgets() or scanf()

I am trying to write a program in C where I intend to control the execution of a while loop according to user input in stdin. I am able to write the program in three different ways as following which perform as intended:
Using scanf() function
#include<stdio.h>
#include<string.h>
int main()
{
char loop= 'y';
while(loop=='y')
{
printf("Do you want to continue? [y|n]: ");
scanf("%c", &loop);
while(getchar() != '\n');
if(loop != 'y' && loop != 'n')
{
printf("Error! Please enter 'y' or 'n' \n");
loop = 'y';
}
}
return 0;
}
Using fgets() function
#include<stdio.h>
#include<string.h>
int main()
{
char loop[5]= "yes\n";
printf("%s",loop);
while(strcmp(loop,"yes\n")==0)
{
printf("Do you want to continue? [yes|no]: ");
if(strcmp(loop,"yes\n")!=0 && strcmp(loop,"no\n")!=0)
printf("Error! Please Enter 'yes' or 'no'\n");
else
fgets(loop,5,stdin);
}
return 0;
}
Using getch() from conio.h
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
char loop= 'y';
while(loop=='y')
{
printf("Do you want to continue? [y|n]: ");
loop = getch();
printf("\n");
if(loop != 'y' && loop != 'n')
{
printf("Error! Please enter 'y' or 'n' \n");
loop = 'y';
}
}
return 0;
}
Although all the aforementioned methods perform the task of stopping or continuing the while loop according to user input, the getch() is little different. Using getch(), the user does not have to press the enter after the user inputs y or n and the program terminates or continues as soon as the user provides input.
I am aware that conio.h is not included in the standard gcc library and is frowned upon to use. However, I would like to implement the functionality of getch() using either scanf() or fgets() or any other standard library function. By functionality of getch(), I mean that as soon as a user press the desired key on terminal, the while loop should terminate without needing to press the enter by the user.
Is it possible for either fgets() or scanf() to do this task?

reading user command to continue does not work

I'm Writing a program for Billing System. I'm using do-while loop in my program. And the program is executed according to user input. If the user want to continue the execution, the program will be continue. But I Got a prob in Execution. I was trying my logic in simple do-while loop. The same Problem arises for simple do-while loop also.
Problem is: If the input is yes, the program does not get the further input from user.
That simple do-while loop is:
#include <stdio.h>
main()
{
int c;
char ch;
do
{
printf("enter the no less then 4:");
scanf("%d",&c);
switch(c)
{
case 1:
printf("In 1\n");
break;
case 2:
printf("In 2\n");
break;
case 3:
printf("In 3\n");
break;
}
printf("do u want to continue?:");
ch=getchar();
}while(ch=='y');
}
If i put while(ch != 'n') instead of while(ch=='y') the program working fine. I couldn't understand the problem behind this. Please Help me to rectify this. And Explain about this problem.Thank u in advance.
first run, 3 is printed, user types "y" and presses return
getchar() reads 'y' and program loops
second time, getchar() reads newline character from the previous key press
newline is not 'y' so program does not loop
Several problems:
getchar returns an int, not a char, so ch must be an int just like c.
scanf needs a pointer to go with the %d, so it should be scanf("%d", &c);
The while should rather test for EOF, as in while ((ch = getchar()) != EOF)
Note that the input will contain the newlines, which you should deal with (e.g. ignore).
This should be quite robust:
#include <stdio.h>
int main(void)
{
int c, ch;
for (;;) {
printf ("Enter a number (1, 2 or 3):");
fflush (stdout);
if (scanf ("%d", &c) == 1) {
switch (c) {
case 1:
printf ("In 1\n");
break;
case 2:
printf ("In 2\n");
break;
case 3:
printf ("In 3\n");
break;
}
printf ("Do you want to continue? [y/n]:");
fflush (stdout);
while ((ch = getchar ())) {
if (ch == 'y')
break;
else if (ch == 'n' || ch == EOF)
return 0;
}
} else {
printf ("That was not a number. Exiting.\n");
return 0;
}
}
}
While(ch=='y') or the character whatever in while() it will sent to case 3 as per your coding....y is pressing ,it wil sent to case 3 otherwise it wont work
Instead of reading the answer using getchar, use fgets.
As others explained, the second getchar call gives you the newline, which was typed after the first y.
With fgets, you'll get everything the user typed. Then you can check if it's y (just check the first character, or use strcmp).

Press enter to continue after yes/no in C

New programmer here with only some minor Java experience trying my hand at writing something in C. I want to ask someone a Yes/No question, do something depending on their answer, then ask them to press Enter to continue. I'm having two problems:
1.) I can't get the program to accept 'y', 'Y', or "Yes" as answers. I can get it to accept one, but not all three. The "logical OR" operator || isn't working.
2.) I can't get it to stop at "Press Enter to Continue" without two "Flush" commands of:
while (getchar() != '\n');
The code I have and am trying to use is as follows:
int main (int argc, const char * argv[]) {
printf("Would you like to continue? Please press y or n.\n");
if(getchar() == 'y'){
printf("You pressed yes! Continuing...");
}
else{
printf("Pressed no instead of yes.");
}
//flush commands go here
printf("\nPress ENTER to continue...");
if(getchar()=='\n'){
printf("\nGood work!");
}else{
printf("Didn't hit ENTER...");
return 0;
}
Any help would be appreciated, thanks.
Assuming that you are working in *nix environment,
You can create a buffer to store the incoming characters one after the other.
You have two cases:
1. Single character input
2. 3 character String
For all other cases you can blindly say that the input is not OK!
For case 1, i should be 1 and the character should be 'y' or 'Y'
For case 2, i should be 3 and the string should be 'Yes'
Any other case is incorrect. Here is the code:
#include<stdio.h>
int main()
{
char ch[3];
char c;
int i=0;
while(((c=getchar())!='\n')){
ch[i]=c;
i++;
}
ch[i]='\0';
if (i==1)
if (ch[0]=='Y'||ch[0]=='y')
printf("OK");
else
printf("Not OK");
else if(i==3)
if (strcmp(ch,"Yes")==0)
printf("OK");
else
printf("Not OK");
else
printf("NOT OK");
return 0;
}
I would recommend using something like this.
First off you might like to save the result of the first getchar() to test each possible value
eg
int c=getchar();
if(c=='y' || c=='Y')
....
The reason the "enter" part skips for the second test is because when you type 'y' or 'n' you press enter after to send your input - the \n is still in the buffer and it pulled by the next call to getchar()

Resources