|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
[C] problema (penso) con strchr
ciao a tutti! scusate la banalità del mio problema, ma sono agli inizi
![]() ![]() allora io deve prendere in input dalla tastiera al massimo n caratteri digitati dall'utente. fin qui tutto semplice, ho usato fgets che mi controlla anche quanti caratteri leggermi (ne prende n-1 lo so, però fa lo stesso quando definisco n lo incremento di una unità) il mio problema è che salva nell'array anche il \n... quindi utilizzo la funzione strchr per cercare il valore \n nell'array, e poi, conoscendone l'indirizzo, lo sovrascrivo con \0, e così sono a posto! il problema è che a volte nell'array \n non c'è, ed il programma va in crash.. secondo me è colpa di strchr che non trova il valore, ma non so che fare.. qualcuno mi potrebbe dare qualche consiglio?? ![]() so che si può fare tutto questo con un bel ciclo while ed un getchar (l'ho già fatto) ma vorrei provare a farlo utilizzando le funzioni sulle stringhe visto che dovrerbbero semplificare la vita (anche se non nel mio caso ![]() grazie mille a tutti in anticipo ![]() ![]()
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
![]() |
![]() |
![]() |
#2 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Hai provato a sfruttare il fatto che strchr restituisce NULL se non trova il carattere?
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
char *p; if ((p = strchr (buffer, '\n')) != NULL) *p = '\0';
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
eh si sono proprio un niubbo non ci avevo pensato a mettere un controllo sul null
![]() ![]() ![]() scusate ![]() altra piccola domanda: io vorrei svuotare il buffer di lettura (stdin), ed ho trovato cercando in rete questo comando: fflush(stdin), però mi è stato detto(anche su questo forum ma in un altro topic) che non è portabile.. non c'è un modo di svuotare il buffer e che sia ansi c??
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Anche se, a dire il vero, su talune piattaforme consente di svuotare il buffer di input. Quindi usare fflush(stdin) non è una buona soluzione e potrebbe non funzionare.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
Quote:
non c'è un modo "sicuro" per svuotare il buffer di lettura??
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
da http://freeweb.supereva.com/sourcene...b/faq_c.htm?p:
Durante l’inserimento di caratteri da tastiera, questi vengono depositati in un apposito buffer, fino a quando non viene premuto il tasto <Invio>. A questo punto le funzioni atte all’acquisizione dati da tastiera, (che in C viene vista come un qualunque file chiamato stdin – standard input -) come scanf(), leggono il buffer e inseriscono i dati letti, nella/e variabili definite dall’utente, fintanto che trovano nel buffer dati consistenti con il formato specificato. Il resto dei dati viene lasciato nel buffer, cosicché alla prossima chiamata di scanf() essi saranno i primi ad essere letti. Questo può essere buono perché evita di perdere dati ma, se non si considera tale meccanismo, si rischia di perdere ore a cercare di capire come mai il nostro programma non funziona come dovrebbe. Un metodo per svuotare il buffer potrebbe essere quello di leggerlo fino a quando non si incontra il carattere ‘\n’, ma se l’input è bufferizzato a più livelli potrebbe non funzionare. E’ comunque il metodo più portabile: while ( getchar() != '\n' ); L’uso della funzione standard fflush() applicata al file stdin è invece da evitare in quanto l’ISO C non definisce un comportamento preciso per questa funzione quando applicata ai file di input. Alcuni compilatori potrebbero implementare fflush() in modo che abbia lo stesso comportamento su tutti i file (input e output), ma l’uso di questa caratteristica fa perdere portabilità al programma. da quello che ho capito ti serviva qualcosa del genere? spero di essere stato utile ![]() |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
quella pagina con il testo verde e lo sfondo nero l'avevo trovata anche io
![]() si il mio problema era quello, in un programma avevo dei problemi con delle scanf, e solo dopo un pò mi è venuto in mente del buffer della tastiera.. per il while(..getchar..) nel programma che serviva a me non era proprio il massimo andava molto meglio la scanf.. cmq grazie mille per le info!
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:35.