PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > comp.lang.c > pressing 'q' or non-numeric char to exit loop/program
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
pressing 'q' or non-numeric char to exit loop/program

Réponse
 
LinkBack Outils de la discussion
Vieux 09/05/2008, 21h57   #1
icarus
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut pressing 'q' or non-numeric char to exit loop/program

Hi, this is a simple temperature converter (Fahrenheit to Celsius to
Kelvin). Using gcc 4.0.

The user is supposed to enter q or any other non-character to exit the
program.

Problem with this code:
I enter 'q' as soon as the program starts. It hangs.
Then run it again. Enter a number, it executes fine. But when I enter
q, it repeats last number and it doesn't 'pay attention' to the letter
entered.


Any ideas on how can I fix it? thanks in advance.

#include <stdio.h>

const double F_TO_CELS_ONE_EIGHT = 1.8;
const double F_TO_CELS_THIRTYTWO = 32.0;
const double C_TO_KELVIN = 273.16;

void Temperatures(double f_temp);

int main(void){

double f_temp;
char quit;


while (quit != "q"){
printf("Enter temperature in Fahrenheit (q to quit):
");
quit = getchar();
scanf("%lf", &f_temp);
Temperatures(f_temp);
}
printf("\nbye!");
return 0;
}

void Temperatures(double f_temp){

double celsius, kelvin;

celsius = (F_TO_CELS_ONE_EIGHT * f_temp) + F_TO_CELS_THIRTYTWO;
kelvin = celsius + C_TO_KELVIN;

printf("Fahrenheit degrees: %.2f\n", f_temp);
printf("Celsius degrees: %.2f\n", celsius);
printf("Kelvin degrees: %.2f\n", kelvin);


}
  Réponse avec citation
Vieux 09/05/2008, 22h33   #2
Richard Heathfield
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus said:

<snip>

> Any ideas on how can I fix it?


Yes.

> #include <stdio.h>
>
> const double F_TO_CELS_ONE_EIGHT = 1.8;
> const double F_TO_CELS_THIRTYTWO = 32.0;
> const double C_TO_KELVIN = 273.16;
>
> void Temperatures(double f_temp);
>
> int main(void){
>
> double f_temp;
> char quit;


int quit; /* getchar returns int, not char */

>
>
> while (quit != "q"){


while(quit != 'q'){

"q" is a string literal. You want to compare with a character, not a
string.

> printf("Enter temperature in Fahrenheit (q to quit):
> ");
> quit = getchar();
> scanf("%lf", &f_temp);


Bad idea. Let's say you enter the characters '2', '1', '2' (boiling point
of water) and a newline character. The first '2' is stored in quit,
leaving '1' and '2' to be converted into 12 which is stored in f_temp.
Now, 12 Fahrenheit is a lot colder than boiling point (in fact, it's 20
below freezing).

I recommend capturing the data as a string and inspecting the first
character. If it's not 'q', hand the string off to sscanf (or, better
still, strtod) for conversion.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
  Réponse avec citation
Vieux 09/05/2008, 22h48   #3
Flash Gordon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote, On 09/05/08 21:57:
> Hi, this is a simple temperature converter (Fahrenheit to Celsius to
> Kelvin). Using gcc 4.0.
>
> The user is supposed to enter q or any other non-character to exit the
> program.
>
> Problem with this code:
> I enter 'q' as soon as the program starts. It hangs.
> Then run it again. Enter a number, it executes fine. But when I enter
> q, it repeats last number and it doesn't 'pay attention' to the letter
> entered.
>
>
> Any ideas on how can I fix it? thanks in advance.
>
> #include <stdio.h>
>
> const double F_TO_CELS_ONE_EIGHT = 1.8;
> const double F_TO_CELS_THIRTYTWO = 32.0;
> const double C_TO_KELVIN = 273.16;
>
> void Temperatures(double f_temp);
>
> int main(void){
>
> double f_temp;
> char quit;


What value does quit have here since it has never been assigned a value?

> while (quit != "q"){
> printf("Enter temperature in Fahrenheit (q to quit):
> ");
> quit = getchar();


So you have read one character, now you go and call scanf whatever the
suer input! What happens to the newline you enter at the end of the line?

> scanf("%lf", &f_temp);


<snip>

scanf returns a value, what does it mean?

You need to start by thinking about how user input works, it looks like
you did not think about it before writing this. I would suggest that
using fgets for input and then checking and using what was entered.
--
Flash Gordon
  Réponse avec citation
Vieux 10/05/2008, 01h04   #4
icarus
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

> You need to start by thinking about how user input works, it looks like
> you did not think about it before writing this. I would suggest that
> using fgets for input and then checking and using what was entered.
> --
> Flash Gordon


yeah yeah yeah flash gordon, spare me the lecture.

if you are so thoughtful,
why don't you elaborate a little more on your possible solution then?




On May 9, 11:48 am, Flash Gordon <s...@flash-gordon.me.uk> wrote:
> icarus wrote, On 09/05/08 21:57:
>
>
>
> > Hi, this is a simple temperature converter (Fahrenheit to Celsius to
> > Kelvin). Using gcc 4.0.

>
> > The user is supposed to enter q or any other non-character to exit the
> > program.

>
> > Problem with this code:
> > I enter 'q' as soon as the program starts. It hangs.
> > Then run it again. Enter a number, it executes fine. But when I enter
> > q, it repeats last number and it doesn't 'pay attention' to the letter
> > entered.

>
> > Any ideas on how can I fix it? thanks in advance.

>
> > #include <stdio.h>

>
> > const double F_TO_CELS_ONE_EIGHT = 1.8;
> > const double F_TO_CELS_THIRTYTWO = 32.0;
> > const double C_TO_KELVIN = 273.16;

>
> > void Temperatures(double f_temp);

>
> > int main(void){

>
> > double f_temp;
> > char quit;

>
> What value does quit have here since it has never been assigned a value?
>
> > while (quit != "q"){
> > printf("Enter temperature in Fahrenheit (q to quit):
> > ");
> > quit = getchar();

>
> So you have read one character, now you go and call scanf whatever the
> suer input! What happens to the newline you enter at the end of the line?
>
> > scanf("%lf", &f_temp);

>
> <snip>
>
> scanf returns a value, what does it mean?
>
> You need to start by thinking about how user input works, it looks like
> you did not think about it before writing this. I would suggest that
> using fgets for input and then checking and using what was entered.
> --
> Flash Gordon


  Réponse avec citation
Vieux 10/05/2008, 05h06   #5
CBFalconer
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote:
>
>> You need to start by thinking about how user input works, it
>> looks like you did not think about it before writing this. I
>> would suggest that using fgets for input and then checking and
>> using what was entered.

>
> yeah yeah yeah flash gordon, spare me the lecture. if you are so
> thoughtful, why don't you elaborate a little more on your possible
> solution then?


PLONK. I won't be seeing you.

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.


** Posted from http://www.teranews.com **
  Réponse avec citation
Vieux 10/05/2008, 06h05   #6
Richard Heathfield
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus said:

>> You need to start by thinking about how user input works, it looks like
>> you did not think about it before writing this. I would suggest that
>> using fgets for input and then checking and using what was entered.
>> --
>> Flash Gordon

>
> yeah yeah yeah flash gordon, spare me the lecture.


I didn't realise you don't like lectures. From now on, I shall spare you
lectures as well.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
  Réponse avec citation
Vieux 10/05/2008, 10h09   #7
Flash Gordon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote, On 10/05/08 01:04:
>> You need to start by thinking about how user input works, it looks like
>> you did not think about it before writing this. I would suggest that
>> using fgets for input and then checking and using what was entered.
>> --
>> Flash Gordon

>
> yeah yeah yeah flash gordon, spare me the lecture.
>
> if you are so thoughtful,
> why don't you elaborate a little more on your possible solution then?


<snip>

Because you need to learn to solve these problems yourself rather than
being spoon fed. The final sentence you quote should be enough for you
to solve your problem and thinking about the questions I asked should
allow you to see what is wrong with your current code.
--
Flash Gordon
  Réponse avec citation
Vieux 10/05/2008, 12h58   #8
pete
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote:
> Hi, this is a simple temperature converter (Fahrenheit to Celsius to
> Kelvin). Using gcc 4.0.
>
> The user is supposed to enter q or any other non-character to exit the
> program.
>
> Problem with this code:
> I enter 'q' as soon as the program starts. It hangs.
> Then run it again. Enter a number, it executes fine. But when I enter
> q, it repeats last number and it doesn't 'pay attention' to the letter
> entered.
>
>
> Any ideas on how can I fix it? thanks in advance.
>
> #include <stdio.h>
>
> const double F_TO_CELS_ONE_EIGHT = 1.8;
> const double F_TO_CELS_THIRTYTWO = 32.0;
> const double C_TO_KELVIN = 273.16;
>
> void Temperatures(double f_temp);
>
> int main(void){
>
> double f_temp;
> char quit;
>
>
> while (quit != "q"){
> printf("Enter temperature in Fahrenheit (q to quit):
> ");
> quit = getchar();
> scanf("%lf", &f_temp);
> Temperatures(f_temp);
> }
> printf("\nbye!");
> return 0;
> }
>
> void Temperatures(double f_temp){
>
> double celsius, kelvin;
>
> celsius = (F_TO_CELS_ONE_EIGHT * f_temp) + F_TO_CELS_THIRTYTWO;
> kelvin = celsius + C_TO_KELVIN;
>
> printf("Fahrenheit degrees: %.2f\n", f_temp);
> printf("Celsius degrees: %.2f\n", celsius);
> printf("Kelvin degrees: %.2f\n", kelvin);
>
>
> }


/* BEGIN new.c */

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

#define F_TO_CELS_RATIO ((100 - 0) / (212.0 - 32))
#define F_TO_CELS_OFFSET (-32.0)
#define C_TO_KELVIN_OFFSET 273.16

void Temperatures(double f_temp);
int get_line(char **lineptr, size_t *n, FILE *stream);

int main(void)
{
double f_temp;
char **quit;
int rc;
char *buff = NULL;
size_t size = 0;

fputs("Enter temperature in Fahrenheit (q to quit):", stdout);
fflush(stdout);
while((rc = get_line(&buff, &size, stdin)) > 0) {
f_temp = strtod(buff, quit);
if (*quit == buff) {
break;
}
Temperatures(f_temp);
printf("Enter temperature in Fahrenheit (q to quit):");
fflush(stdout);
}
puts("\nbye!");
return 0;
}

void Temperatures(double f_temp)
{
double celsius, kelvin;

celsius = F_TO_CELS_RATIO * (f_temp + F_TO_CELS_OFFSET);
kelvin = celsius + C_TO_KELVIN_OFFSET;
printf("Fahrenheit degrees: %.2f\n", f_temp);
printf("Celsius degrees: %.2f\n", celsius);
printf("Kelvin degrees: %.2f\n", kelvin);
}

int get_line(char **lineptr, size_t *n, FILE *stream)
{
int rc;
void *p;
size_t count;

count = 0;
while ((rc = getc(stream)) != EOF
|| !feof(stream) && !ferror(stream))
{
++count;
if (count == (size_t)-2) {
if (rc != '\n') {
(*lineptr)[count] = '\0';
(*lineptr)[count - 1] = (char)rc;
} else {
(*lineptr)[count - 1] = '\0';
}
break;
}
if (count + 2 > *n) {
p = realloc(*lineptr, count + 2);
if (p == NULL) {
if (*n > count) {
if (rc != '\n') {
(*lineptr)[count] = '\0';
(*lineptr)[count - 1] = (char)rc;
} else {
(*lineptr)[count - 1] = '\0';
}
} else {
if (*n != 0) {
**lineptr = '\0';
}
ungetc(rc, stream);
}
count = 0;
break;
}
*lineptr = p;
*n = count + 2;
}
if (rc != '\n') {
(*lineptr)[count - 1] = (char)rc;
} else {
(*lineptr)[count - 1] = '\0';
break;
}
}
if (rc != EOF || !feof(stream) && !ferror(stream)) {
rc = INT_MAX > count ? count : INT_MAX;
} else {
if (*n > count) {
(*lineptr)[count] = '\0';
}
}
return rc;
}

/* END new.c */


--
pete
  Réponse avec citation
Vieux 10/05/2008, 14h48   #9
pete
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

pete wrote:

> char **quit;


> f_temp = strtod(buff, quit);
> if (*quit == buff)


Thats' wrong.
It should be

char *quit = NULL;

f_temp = strtod(buff, &quit);
if (quit == buff)

instead.


--
pete
  Réponse avec citation
Vieux 12/05/2008, 19h57   #10
icarus
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

Thanks Pete, you da man!! you've outdone yourself mate...

I'll tweak it around to keep on learning C. I appreciate it.

~~
Richard Heathfield, I liked your first message, where I could learn
something mate.
I got the bad vibe from "Flash Gordon", not you mate. I believe I
stated that on the opening paragraph.

I truly perceived a condescending tone with that fellow. And that
won't be tolerated.
That was confirmed by his second reply.

What is this? do we need to start being pushovers now? worship and
respecting bullies because they know more?

If I got on his nerves for asking a newbie question, then he should
have ignored my lousy post and move on.
I think a message something like .."you can use this and that
function, here's a quick example: " that would have been plenty and
that's all I was asking really.

Now I'm done. Again, thanks for your first message. That got me going
on the right direction.
I hope this clarifies a little. If not, too bad.



On May 10, 3:48 am, pete <pfil...@mindspring.com> wrote:
> pete wrote:
> > char **quit;
> > f_temp = strtod(buff, quit);
> > if (*quit == buff)

>
> Thats' wrong.
> It should be
>
> char *quit = NULL;
>
> f_temp = strtod(buff, &quit);
> if (quit == buff)
>
> instead.
>
> --
> pete


  Réponse avec citation
Vieux 12/05/2008, 20h23   #11
Eric Sosman
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote:
> [...]
> I got the bad vibe from "Flash Gordon", not you mate. I believe I
> stated that on the opening paragraph.
>
> I truly perceived a condescending tone with that fellow. And that
> won't be tolerated.
> That was confirmed by his second reply.


He spotted a number of errors in your code, hinted at
ways to remedy them, and finished by recommending a different
(and superior) approach altogether. What in the world are you
complaining about?

May the wax in your wings melt and dribble.

--
Eric.Sosman@sun.com
  Réponse avec citation
Vieux 12/05/2008, 23h55   #12
pete
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: pressing 'q' or non-numeric char to exit loop/program

icarus wrote:
> Thanks Pete, you da man!! you've outdone yourself mate...


You're welcome.

If you have questions about the code
I'll answer them as best as I can.

--
pete
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 05h07.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,24694 seconds with 20 queries