In my C program, I call fgets()
twice to get input from the user. However, on the second call of fgets()
(which is in a function), it doesn't wait for the input to be taken, it just skips over it as if it didn't even ask for it. Here is my code (shortened down a bit):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARE_EQUAL 0
void rm_nl(char *c, int s);
float ctof();
float ftoc();
int main()
{
char str[2]; // Setting vars
float result;
printf("Type 'C' or 'F': "); // Prompt
fgets(str, 2, stdin); // <-- First fgets
rm_nl(str, 2); // rm_nl() removes the newline
// from input
printf("\n");
if(strcmp(str, "C") == ARE_EQUAL || strcmp(str, "c") == ARE_EQUAL)
{
result = ctof(); // Compares strings and calls
printf("%.2f\n", result); // function conditionally
}
else
{
result = ftoc();
printf("%.2f\n", result);
}
return 0;
}
float ctof() // One of the two functions
{ // (they are almost the same)
char input[64];
float fahr, cels; // Local vars
printf("Type in a Celsius value: "); // Prompt
fgets(input, 64, stdin); // <-- Second fgets
rm_nl(input, sizeof(input));
// Yadda yadda yadda
}
// Second function and rm_nl() not shown for readability
This program would output something like:
Type 'C' or 'F': (value)
and then...
Type a Celsius value: 57.40 (I don't type this)
(Program terminates)
It fills in the 57.40 without me even typing it! What should I do differently?
fgets(str, 2, stdin);
You're providing too little space for fgets
. You only allow it to read one character (since 2
includes the 0-terminator).
The newline will always be left in the input buffer so the next stdio operation will read it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With