View Full Version : C: scanf non mi va!!!!
Ciao volevo provare a fer un programma in c che mi chiedesse il mio nome, me lo leggesse e mi mi salutasse con questo nome... ma come faccio??? non sono riuscito kn string!!!
X favore aiuto
ilsensine
10-06-2003, 20:46
Questo?
#include <stdlib.h>
#include <stdio.h>
int main() {
char *n;
printf("Qual è il tuo nome? ");
scanf("%as", &n);
printf("\nCiao %s\n", n);
free(n);
return 0;
}
Louder Than Hell
10-06-2003, 22:59
IlSensine: se non si libera n -in questo caso- che cosa succede? Che il tutto rimane in memoria ad occupare spazio??
ilsensine
11-06-2003, 08:29
Il formato "%as" è una estensione GNU non presente nell'ANSI c. Indica che la memoria necessaria per la stringa viene allocata con malloc in base alla dimensione della stringa (per questo passo &n a scanf, e non semplicemente n come quando usi "%s"). E' comodo, ma ovviamente è poi compito dell'utente liberare la memoria con free.
'man scanf' descrive tutte le opzioni.
il codice di ilsensine non mi va in windows, adesso provo in linux
ilsensine
11-06-2003, 11:35
Originally posted by "LukA4e"
il codice di ilsensine non mi va in windows, adesso provo in linux
Certo, "%as" è una estensione GNU.
Per windows devi usare qualcosa tipo:
char n[256];
scanf("%s", n);
e togliere free(n). Nota che questo codice è suscettibile di buffer overflow.
lombardp
11-06-2003, 12:19
Originally posted by "ilsensine"
Certo, "%as" è una estensione GNU.
Per windows devi usare qualcosa tipo:
char n[256];
scanf("%s", n);
e togliere free(n). Nota che questo codice è suscettibile di buffer overflow.
Dovrebbe essere possibile mettersi al sicuro dal buffer overflow scrivendo:
scanf("%255s", n);
Dove 255 è la lunghezza dell'array di char, meno 1.
ilsensine
11-06-2003, 12:30
E' una soluzione, ma devi comunque poter accettare dei "troncamenti" nelle stringhe di ingresso se sono di lunghezza non prevedibile, o almeno gestirli in qualche modo. E' più o meno come strncpy & co funzionano.
Louder Than Hell
11-06-2003, 13:04
Nel caso usi per esempio %d, %s o altri non c'è bispogno di liberare lo spazio o si?
ilsensine
11-06-2003, 13:12
No, viene "allocato" in precedenza. Per %d o simili non c'è problema (sizeof(int)=costante), per %s occurre un pò di attenzione.
Louder Than Hell
11-06-2003, 23:34
ok grazie ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.