Pagina 1 di 2

[C] valore predefinito se nullo [risolto]

Inviato: dom 12 dic 2010, 19:19
da sya54M
salve, sto scrivendo un programmino di idraulica e siccome raramente si dovrà inserire una viscosità diversa da quella dell'acqua (10^-6) vorrei poter assumere questo valore predefinito nel caso non ne venga inserito nessuno... ho fatto delle prove, con la scanf mi sembra impossibile perchè si aspetta necessariamente un valore prima dell'invio e con la getchar ho avuto comportamenti strani (non dovuti al buffer). potete darmi dei consigli? grazie mille!

Re: [C] valore predefinito se nullo

Inviato: lun 13 dic 2010, 0:07
da nyquist
Ciao,
a quest'ora di notte mi viene in mente questo

Codice: Seleziona tutto

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

#define VISC_ACQUA 0.000001
#define STR_VISC_LEN 16

int main()
{
   float visc;
   char str_visc[STR_VISC_LEN];
  
   visc=VISC_ACQUA;
   
   if(strcmp(gets(str_visc),"")==0)  //se la stringa letta è vuota allora in visc metti la viscosità dell'acqua
      visc=VISC_ACQUA;
   else visc=atof(str_visc);         //altrimenti metti in visc la viscosità inserita (diversa da quella dell'acqua)
   printf("%f\n", visc);
   
   return EXIT_SUCCESS;
}
Prova a vedere se fa al caso tuo...

Re: [C] valore predefinito se nullo

Inviato: mer 15 dic 2010, 14:07
da sya54M
ti ringrazio, però ho provato... il compilatore mi dice che gets è pericolosa, quindi ho fatto la stessa cosa con fgets ma non fa quello che deve fare ma si assegna sempre 0 alla variabile senza chiedere nulla in input :?

Re: [C] valore predefinito se nullo

Inviato: mer 15 dic 2010, 15:06
da nyquist
Il warning lo dava anche a me in fase di compilazione con gcc. Non ne sono sicuro, ma la pericolosità di usare la "gets" credo derivi dal fatto che essa possa essere oggetto di exploit o qualcosa di simile. Non sono sicuro al 100%, quindi non vorrei dire fesserie.
La "fgets" di solito la uso non per leggere dallo standard input (tastiera) ma da file.

Re: [C] valore predefinito se nullo

Inviato: mer 15 dic 2010, 15:23
da ZeD
per la "pericolosità" di gets() vi rimando a http://www.c-faq.com/stdio/getsvsfgets.html

Re: [C] valore predefinito se nullo

Inviato: mer 15 dic 2010, 15:25
da Blallo
per usare fgets puoi prima dare un sscanf, poi puoi usare il buffer della sscanf in fgets

Re: [C] valore predefinito se nullo

Inviato: mer 15 dic 2010, 15:34
da Mario Vanoni
nyquist ha scritto:Il warning lo dava anche a me in fase di compilazione con gcc. Non ne sono sicuro, ma la pericolosità di usare la "gets" credo derivi dal fatto che essa possa essere oggetto di exploit o qualcosa di simile. Non sono sicuro al 100%, quindi non vorrei dire fesserie.
La "fgets" di solito la uso non per leggere dallo standard input (tastiera) ma da file.
man 3 gets

Codice: Seleziona tutto

BUGS
       Never use gets().  Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past
       the end of the buffer, it is extremely dangerous to use.  It has been used to break computer security.  Use fgets() instead.
@sya54M
hai messo tutti i parametri di fgets?
char *fgets(char *s, int size, FILE *stream);
p. e.
fgets(buf, 16, stdin);

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 13:09
da sya54M
Mario Vanoni ha scritto:@sya54M
hai messo tutti i parametri di fgets?
char *fgets(char *s, int size, FILE *stream);
p. e.
fgets(buf, 16, stdin);
certo, ho fatto così, con meno di 3 argomenti da errore di sintassi poi....

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 15:52
da masalapianta
sya54M ha scritto:ti ringrazio, però ho provato... il compilatore mi dice che gets è pericolosa, quindi ho fatto la stessa cosa con fgets ma non fa quello che deve fare ma si assegna sempre 0 alla variabile senza chiedere nulla in input :?
se non riesci ad usare una funzione standard delle libc è enormemente più probabile che sia tu che la usi male, piuttosto che sia lei a non fare quello che deve fare, non credi?
comunque come puoi vedere fgets fa esattamente quel che deve:

Codice: Seleziona tutto

ale@manetta:/tmp$ cat > fgets.c
#include <stdio.h>
int main()
{
  char lallallero[256];
  fgets(lallallero, 256, stdin);
  printf("eccotelatiettela: %s", lallallero);
  return 0;
}
^C
ale@manetta:/tmp$ gcc fgets.c 
ale@manetta:/tmp$ echo aaaaaaa|./a.out 
eccotelatiettela: aaaaaaa
ale@manetta:/tmp$ 

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 16:09
da sya54M
ecco, il problema è che io l'input lo devo inserire interattivamente (ma deve accettare anche il solo invio per prendere il valore predefinito) e non concatenando un echo

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 16:19
da masalapianta
sya54M ha scritto:ecco, il problema è che io l'input lo devo inserire interattivamente (ma deve accettare anche il solo invio per prendere il valore predefinito) e non concatenando un echo
eeeh??? guarda che se scrivi sul terminale o lo metti in pipe, sempre su stdin stai scrivendo; non cambia una mazza:

Codice: Seleziona tutto

ale@manetta:/tmp$ ./a.out

eccotelatiettela: 
ale@manetta:/tmp$ ./a.out
aaaaaaaaaaa
eccotelatiettela: aaaaaaaaaaa
ale@manetta:/tmp$
come vedi e come ho detto, non cambia una mazza; forse nel precedente post non sono stato sufficientemente chiaro quindi sarò più esplicito: hai sicuramente fatto qualche casino tu nel codice

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 18:16
da sya54M
guarda, io non cpaisco cosa ho sbagliato:

Codice: Seleziona tutto

#define VISC_ACQUA 0.000001
#define STR_VISC_LEN 16
void progetto_tre_serbatoi() { 
  float ni;
  ...
  char str_ni[STR_VISC_LEN];

  printf("\nViscosita' [10^-6]: ");

  if(fgets(str_ni, STR_VISC_LEN, stdin) == NULL)
    ni = VISC_ACQUA;
  else ni = atof(str_ni);
  printf("%f\n%s\n", ni, str_ni);
  ...

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 21:29
da Mario Vanoni
sya54M ha scritto:guarda, io non cpaisco cosa ho sbagliato:

Codice: Seleziona tutto

#define VISC_ACQUA 0.000001
#define STR_VISC_LEN 16
void progetto_tre_serbatoi() { 
  float ni;
  ...
  char str_ni[STR_VISC_LEN];

  printf("\nViscosita' [10^-6]: ");

  if(fgets(str_ni, STR_VISC_LEN, stdin) == NULL)
    ni = VISC_ACQUA;
  else ni = atof(str_ni);
  printf("%f\n%s\n", ni, str_ni);
  ...
Provando in un main() il tuo codice, ho notato,
sistema US-ASCII, quindi divisore decimale fisso il punto (.):

immettendo valori richiestti con virgola (n,n) oppure con punto (n.n)
i valori di ni sempre falsi, ma cambiano da 44.000000 con virgola a
1072273817.0000000 con punto decimale.
Imettendo un solo Return, sempre 0.000000.

Nel tuo codice hai mescolato il divisore decimale?

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 21:39
da sya54M
infatti, ma a me è peggio: nemmeno un return e mi da direttamente sempre 0.000000

non ho capito cosa vuoi dire con mescolare

Re: [C] valore predefinito se nullo

Inviato: gio 16 dic 2010, 23:39
da masalapianta
sya54M ha scritto:guarda, io non cpaisco cosa ho sbagliato:

Codice: Seleziona tutto

#define VISC_ACQUA 0.000001
#define STR_VISC_LEN 16
void progetto_tre_serbatoi() { 
  float ni;
  ...
  char str_ni[STR_VISC_LEN];

  printf("\nViscosita' [10^-6]: ");

  if(fgets(str_ni, STR_VISC_LEN, stdin) == NULL)
    ni = VISC_ACQUA;
  else ni = atof(str_ni);
  printf("%f\n%s\n", ni, str_ni);
  ...
se non dai un return e basta il codice funziona, ma se dai un return e basta, come pretendi che fgets() torni NULL se tu non levi il "\n" (torna NULL solo se c'è l'EOF ma non è stato letto alcun carattere, ma se dai invio e basta viene letto un carattere (\n) )?