[C] valore predefinito se nullo [risolto]
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.
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.
- sya54M
- 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]
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.
- nyquist
- 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
Ciao,
a quest'ora di notte mi viene in mente questo
Prova a vedere se fa al caso tuo...
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;
}
- sya54M
- 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
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
- nyquist
- 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
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.
La "fgets" di solito la uso non per leggere dallo standard input (tastiera) ma da file.
Re: [C] valore predefinito se nullo
per la "pericolosità" di gets() vi rimando a http://www.c-faq.com/stdio/getsvsfgets.html
- Blallo
- 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
per usare fgets puoi prima dare un sscanf, poi puoi usare il buffer della sscanf in fgets
Github: https://github.com/8lall0
-
- 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
man 3 getsnyquist 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.
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.
hai messo tutti i parametri di fgets?
char *fgets(char *s, int size, FILE *stream);
p. e.
fgets(buf, 16, stdin);
- sya54M
- 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
certo, ho fatto così, con meno di 3 argomenti da errore di sintassi poi....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);
- masalapianta
- 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
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?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
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$
- sya54M
- 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
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
- masalapianta
- 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
eeeh??? guarda che se scrivi sul terminale o lo metti in pipe, sempre su stdin stai scrivendo; non cambia una mazza: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
Codice: Seleziona tutto
ale@manetta:/tmp$ ./a.out
eccotelatiettela:
ale@manetta:/tmp$ ./a.out
aaaaaaaaaaa
eccotelatiettela: aaaaaaaaaaa
ale@manetta:/tmp$
- sya54M
- 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
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);
...
-
- 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
Provando in un main() il tuo codice, ho notato,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); ...
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?
- sya54M
- 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
infatti, ma a me è peggio: nemmeno un return e mi da direttamente sempre 0.000000
non ho capito cosa vuoi dire con mescolare
non ho capito cosa vuoi dire con mescolare
- masalapianta
- 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
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) )?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); ...