Pressing enter in C input programm [duplicate] - c

This question already has answers here:
Why doesn't getchar() wait for me to press enter after scanf()?
(10 answers)
Closed 6 years ago.
I've been trying to teach myself C off the website http://www.cprogramming.com/.
I've come to the code which requires an input number.
Here is the code:
#include <stdio.h>
int main()
{
int this_is_a_number;
printf( "Please enter a number: " );
scanf( "%d", &this_is_a_number );
printf( "You entered %d", this_is_a_number );
getchar();
return 0;
}
However when I run this, and try to enter a number into the prompt, the command window just closes. Any help would greatly be appreciated.

scanf reads the number, but leaves the newline character you inputted in the input stream.
So getchar fetches it immediately instead of waiting for extra input.
You can add another call to getchar. It's probably the simplest solution for your simple program.

Use another getchar(); to consume the newline character left by the scanf() call; so that, the second getchar(); would hold the prompt.
getchar();
getchar();
...
Normally, you wouldn't need this. But if you are running exe (typically Windows) and want to wait at the end (which appears to be the case here), this trick would do.

Related

Is it possible to use scanf() and getchar() in the same program to get input? [duplicate]

This question already has answers here:
The program doesn't stop on scanf("%c", &ch) line, why? [duplicate]
(2 answers)
Closed 1 year ago.
I'm struggling on a question proving scanf() and getchar() can both retrieve a character from the input.
However, when I try to put them inside the same program, only the first function is running properly. The latter is discarded completely.
#include <stdio.h>
char letter;
int main()
{
printf("I'm waiting for a character: ");
letter = getchar();
printf("\nNo, %c is not the character I want.\nTry again.\n\n",letter);
printf("I'm waiting for a different character: ");
scanf("%c",&letter);
printf("Yes, %c is the one I'm thinking of!\n",letter);
return(0);
}
output
I have tried switching the places of those two functions but it is of no use.
Can someone help me find the issue and provide a way to fix this? The only requirement is that the program takes input twice, once by the getchar() function and once via scanf()
The second read attempt just reads whitespace (the end of line character, since you pressed enter after the first letter). Simply replace it with this:
scanf(" %c", &letter);
The space before % will tell scanf to read the next non-whitespace character.

Printf and scanf not working properly? C programming [duplicate]

This question already has answers here:
scanf() leaves the newline character in the buffer
(7 answers)
Closed 4 years ago.
I have a function that asks the user for user variable and user number.
void numReplace(char infix[50])
{
char userVar;
int userNum;
printf("Please enter the variable you want to change\n");
scanf("%c", &userVar);
printf("Please enter the replacement value for the variable\n");
scanf("%d", &userNum);
printf("%c %d", userVar, userNum);
int i=0;
char chrr;
infix[50] = '\0';
while((chrr=infix[i++])!='\0')
{
if (chrr == userVar){
chrr = userNum;
}
}
}
when running the program I should be asked the userVar and userNum. However the output is:
Please enter the variable you want to change
Please enter the replacement value for the variable
1
1
It only takes in one variable, I don't see a problem with my codes. Can someone help me?
Try adding a getchar(); after every call to scanf().
It's a workaround to the dangling newline character after you press <enter> when using scanf().
See this FAQ for more info.
This uservar may have received the \n you entered last time. If you have input before this input, please accept the newline with getchar().

Why does getchar wait after one character is entered? [duplicate]

This question already has answers here:
How to avoid pressing Enter with getchar() for reading a single character only?
(14 answers)
Closed 4 years ago.
Here is my code:
#include <stdio.h>
int main()
{
char a = getchar();
printf("char: %c", a);
}
I'm compiling this with gcc.
When running, the program waits for input even after one character is entered on console. Shouldn't it immediately exit and print the character? I'm running this on Ubuntu for Windows, if that can make any difference.
stdin is your default input stream. The default buffering mode of stdin is line buffered. So it waits for the \n to be entered. Then only there is something to read from the input stream and then getchar gets the input and works with it.
The operating system often buffers console input until a new line is entered, such that your program will not even receive the single character before. Probably nothing you can do about that.

Error in C simple program [duplicate]

This question already has answers here:
C: Multiple scanf's, when I enter in a value for one scanf it skips the second scanf [duplicate]
(7 answers)
Closed 8 years ago.
This is part of a university lab and the TA tells me there is an error but I haven't a clue. When I run it it asks me for the first char but then runs through the program and doesn't ask me at the second scanf.
#include <stdio.h>
int main(void) {
char sen, ben;
printf("Type in a character: ");
scanf("%c", &sen);
printf("The key just accepted is %d", sen);
printf("\nType in another character: ");
scanf("%c", &ben);
printf("The key just accepted is %d", ben);
}
Actually this is C not C++. Save it as file.c.
Try this:
#include <stdio.h>
int main(void) {
char sen, ben;
printf("Type in a character: ");
sen = getchar();
printf("The key just accepted is %d", sen);
printf("\nType in another character: ");
getchar();
ben = getchar();
printf("The key just accepted is %d", ben);
}
Explanation: when you enter the first character and press enter it takes enter's ASCII code as the second.
I suggest not to use scanf. But it works both ways if you put a getchar to "take" the enter.
Adding a space before %c in the second scanf will solve the issue.
This is done because scanf does not consume the \n character after you enter the first character and leaves it in the stdin.As the Enter key(\n) is also a character,it gets consumed by the next scanf call.The space before the %c will discard all blanks like spaces.
When you are scanning a character(%c) using scanf,add a space before %c as it would help reduce confusion and help you. Therefore, in both the scanfs , you can add the space.
When you pressed your key and then hit enter, you typed in two keys. The first was the desired key ,a for example, and the second was the key <enter> typically written as \n. So, your second scanf captures the result \n.
Since printing out the \n character doesn't result in something that is easy to see on the screen, it will appear like your program is just skipping the second scanf and printing out only the fixed parts of the printf without a easily viewable value.
One way to get around this problem is to consume all the key strokes just before the key you want to capture. This is done by accepting more input after the character up until you see a newline character \n. Once you see that character, then you do your next read.
// flush extra input up the to carriage return
char flush = 0;
while (flush != '\n') {
scanf("%c", &flush);
}
// now read my desired input
scanf("%c", &ben);
that's because nobody accepts '\n'. call scanf like this scanf("%c%*c", &sen). %*c means you want to omit one character, which is '\n'.
btw, void main() is allowed. main function is not the real entry point of executable, so it's ok to do that. but it seems not everybody likes it.

Creating a C face program, but it only takes 2 inputs instead of 3. Why? [duplicate]

This question already has answers here:
C: function skips user input in code
(2 answers)
Closed 8 years ago.
So for a class I am taking I have to learn C and one program I am trying to make is a simple print face program that takes 3 inputted characters and uses them to create a face.
However, whenever I run it, it asks for the eye character, then prints out the "Enter nose character: " but never takes any input, instead skipping right to the mouth character. I have looked over the code and cannot figure out what is causing this.
#include <stdio.h>
void PrintFace(char eye, char nose, char mouth) {
printf("\n %c %c\n", eye, eye); // Eyes
printf(" %c\n", nose); // Nose
printf(" %c%c%c%c%c\n",
mouth, mouth, mouth, mouth, mouth); // Mouth
return;
}
int main() {
char eyeInput;
char noseInput;
char mouthInput;
// Get character for eyes
printf("Enter eye character: ");
scanf("%c", &eyeInput);
// Get character for nose
printf("Enter nose character: ");
scanf("%c", &noseInput);
// Get character for mouth
printf("Enter mouth character: ");
scanf("%c", &mouthInput);
// Print the face using the entered characters
PrintFace(eyeInput, noseInput, mouthInput);
return 0;
}
This is the output I get:
Enter eye character: o
Enter nose character: Enter mouth character: l
o o
lllll
It seems to skip the second scan statement but I can't see why. :/
Because the input stream is line-buffered, you need to press Enter after typing in the character. Now scanf reads a single character from the stream. However, there's still a newline in the stream, and that gets picked up on the next read.
One approach is to use fgets and read a whole line of text, then pick out the first character. However, doing this properly might be a little over the top.
It might be easier if you just use code to ignore characters up until the newline, as suggested here: C code for ignoring the enter key after input. Also, you should consider using getchar or getc instead of scanf. Just make a simple function to do all this stuff, and call it whenever you want to read a character.
The carriage return you're passing by hitting "Enter" after your first character is considered a second character input. Notice the difference in carriage returns in your output.
See the linked question at: C: function skips user input in code
If I remember well, scanf does not take '\n' in a string. So you put for example "dog" as a first entry but you type an enter at the end. So the second scanf take that '\n' in the buffer shiting your program. Solution? Clean up your buffer. If you are over windows fflush() can save you, using fflush(stdin) after each scanf. Over unix fflush() does not work like that and you have to do it manually. An easy way is to put a getc() or something like that that consumes that '\n'

Resources