Repository 32bit  Forum
Repository 64bit  Wiki

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

[C] valore predefinito se nullo [risolto]

Messaggioda sya54M » dom dic 12, 2010 19:19

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 dic 18, 2010 15:53, modificato 1 volta in totale.
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda nyquist » lun dic 13, 2010 0:07

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
nyquist
Linux 2.4
Linux 2.4
 
Messaggi: 217
Iscritto il: sab ago 02, 2008 15:02
Località: Gonars (UD)
Nome Cognome: Cristiano Urban
Slackware: 14.1 x86
Kernel: 3.10.17-smp
Desktop: KDE 4.10.5
Distribuzione: CentOS, Fedora

Re: [C] valore predefinito se nullo

Messaggioda sya54M » mer dic 15, 2010 14:07

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda nyquist » mer dic 15, 2010 15:06

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
nyquist
Linux 2.4
Linux 2.4
 
Messaggi: 217
Iscritto il: sab ago 02, 2008 15:02
Località: Gonars (UD)
Nome Cognome: Cristiano Urban
Slackware: 14.1 x86
Kernel: 3.10.17-smp
Desktop: KDE 4.10.5
Distribuzione: CentOS, Fedora

Re: [C] valore predefinito se nullo

Messaggioda ZeD » mer dic 15, 2010 15:23

per la "pericolosità" di gets() vi rimando a http://www.c-faq.com/stdio/getsvsfgets.html
Avatar utente
ZeD
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: ven ott 28, 2005 11:30
Località: Terra
Slackware: 12.1

Re: [C] valore predefinito se nullo

Messaggioda Blallo » mer dic 15, 2010 15:25

per usare fgets puoi prima dare un sscanf, poi puoi usare il buffer della sscanf in fgets
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [C] valore predefinito se nullo

Messaggioda Mario Vanoni » mer dic 15, 2010 15:34

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);
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] valore predefinito se nullo

Messaggioda sya54M » gio dic 16, 2010 13:09

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda masalapianta » gio dic 16, 2010 15:52

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
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: [C] valore predefinito se nullo

Messaggioda sya54M » gio dic 16, 2010 16:09

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda masalapianta » gio dic 16, 2010 16:19

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
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: [C] valore predefinito se nullo

Messaggioda sya54M » gio dic 16, 2010 18:16

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);
  ...
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda Mario Vanoni » gio dic 16, 2010 21:29

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?
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] valore predefinito se nullo

Messaggioda sya54M » gio dic 16, 2010 21:39

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
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1429
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: [C] valore predefinito se nullo

Messaggioda masalapianta » gio dic 16, 2010 23:39

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) )?
Avatar utente
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti