[C] valore predefinito se nullo [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

[C] valore predefinito se nullo [risolto]

Messaggio 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!
Ultima modifica di sya54M il sab 18 dic 2010, 15:53, modificato 1 volta in totale.

Avatar utente
nyquist
Linux 2.x
Linux 2.x
Messaggi: 269
Iscritto il: sab 2 ago 2008, 16:02
Nome Cognome: Cristiano Urban
Slackware: 14.2 multilib
Kernel: 4.4.240
Desktop: KDE
Località: Gonars (UD)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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...

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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 :?

Avatar utente
nyquist
Linux 2.x
Linux 2.x
Messaggi: 269
Iscritto il: sab 2 ago 2008, 16:02
Nome Cognome: Cristiano Urban
Slackware: 14.2 multilib
Kernel: 4.4.240
Desktop: KDE
Località: Gonars (UD)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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.

Avatar utente
ZeD
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: ven 28 ott 2005, 12:30
Slackware: 12.1
Località: Terra

Re: [C] valore predefinito se nullo

Messaggio da ZeD »

per la "pericolosità" di gets() vi rimando a http://www.c-faq.com/stdio/getsvsfgets.html

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio da Blallo »

per usare fgets puoi prima dare un sscanf, poi puoi usare il buffer della sscanf in fgets

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C] valore predefinito se nullo

Messaggio 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);

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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....

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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$ 

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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);
  ...

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C] valore predefinito se nullo

Messaggio 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?

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: [C] valore predefinito se nullo

Messaggio 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) )?

Rispondi