Moderatore: Staff

#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;
}






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

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

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
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 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
ale@manetta:/tmp$ ./a.out
eccotelatiettela:
ale@manetta:/tmp$ ./a.out
aaaaaaaaaaa
eccotelatiettela: aaaaaaaaaaa
ale@manetta:/tmp$

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

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


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

Visitano il forum: Nessuno e 1 ospite