On entering the first inputs this part of my program terminates.
float p_x,p_y,q_x,q_y,r_x,r_y;
printf("Note :- coordinates are entered as follows (x,y) \n");
printf("Enter the coordinates of 'p' :");
scanf("(%f,%f)",&p_x,&p_y);
printf("Enter the coordinates of 'q' :");
scanf("(%f,%f)",&q_x,&q_y);
CodePudding user response:
Short answer: Change the second scanf
call to
scanf(" (%f,%f)", &q_x, &q_y);
Note the extra space in the format statement.
Longer explanation: One of scanf
's quirks is that it only reads what it needs, and leaves everything else sitting on the input stream for next time. So when you read p_x
and p_y
, scanf
reads the (
, the value for p_x
, the ,
, the value for p_y
, and the )
, but it doesn't do anything with the invisible final \n
on the line, the "newline" character that's there as a result of the Enter key you typed.
So, later, when you try to read q_x
and q_y
, the first thing scanf
wants to see is the (
you said should be there, but the first thing scanf
actually sees is that \n
character left over from last time. So the second scanf
call fails, reading nothing.
In a scanf
format statement, a space character means "read and ignore whitespace". So if you change the second format string to " (%f,%f)"
, scanf
will read and ignore the stray newline, and then it will be able to read the input you asked for.
The reason you don't have this problem all the time is that most (though not all) of the scanf
format characters automatically skip leading whitespace as a part of doing their work. If you had, say, a simpler call to
scanf("%f", &q_x);
followed by a later call to
scanf("%f", &q_y);
it would work just fine, without any extra explicit space characters in the format strings.
General advice: You may be thinking that this is a pretty lame situation. You may have gotten the impression that scanf
was supposed to be a nice, simple way to do input in your C programs, and you may be thinking, "But this is not simple! How was I supposed to know to write " (%f,%f)"
?" And I would absolutely agree with you: This is a pretty lame situation!
The fact is that scanf
only seems to be a nice, simple way to do input. It's actually a terribly complicated, unforgiving, nearly useless mess. It's only simple if you're reading very simple input, such as single numbers or simple strings (not containing spaces), or maybe single characters. For anything more complicated than that, there are so many quirks and foibles and exceptions and special cases that it almost never works the first time, and it's often more trouble than it's worth to even try to get it working.
So the general advice is to only try to use scanf
for very simple input, during the first few weeks of your C programming career. You can read what I mean by "very simple input" in this answer to a previous question. Then, once you've gotten a few skills under your belt, or when you need to do something a little more complicated, its time to learn how to do input using better techniques than scanf
.
CodePudding user response:
Check return value to identify problems.
// scanf("(%f,%f)",&q_x,&q_y); if (scanf("(%f,%f)",&q_x,&q_y) != 2) { puts("Bad input"); }
Tolerate and consume spaces, new lines, tabs, etc. between portion of input. OP did not do this. The
'\n'
of the first entry was not consumed and caused the 2ndscanf()
to fail."%f"
already allows optional leading white-spaces. Add a" "
before the fixed formats characters:(,)
so optional white-spaces will get consumed there too.// v---v---v add spaces to format to allow any white-space in input. if (scanf(" (%f ,%f )",&q_x,&q_y) != 2) { puts("Bad input"); }