View Full Version : [C] problema (penso) con strchr
ciao a tutti! scusate la banalità del mio problema, ma sono agli inizi :rolleyes: :rolleyes:
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?? :confused:
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 :muro: )...
grazie mille a tutti in anticipo :) :)
Ziosilvio
25-03-2006, 08:41
Hai provato a sfruttare il fatto che strchr restituisce NULL se non trova il carattere?
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?? :confused: In genere basta fare così:
char *p;
if ((p = strchr (buffer, '\n')) != NULL)
*p = '\0';
eh si sono proprio un niubbo non ci avevo pensato a mettere un controllo sul null :doh: :doh: :doh:
scusate :D
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??
eh si sono proprio un niubbo non ci avevo pensato a mettere un controllo sul null :doh: :doh: :doh:
scusate :D
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??
fflush() è standard ma il suo significato è quello di "forzare la scrittura dei dati in uno stream di output" non quello di eliminare dei caratteri da un buffer!
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.
fflush() è standard ma il suo significato è quello di "forzare la scrittura dei dati in uno stream di output" non quello di eliminare dei caratteri da un buffer!
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.
io ho provato ad usare fflush(stdin) su win xp (come compilatore uso dev c++ 4.9.9.2) e funziona.. solo non vorrei che compilando lo stesso prog su un altro os (tipo linux) non vada più (cosa che stando a quanto ho capito è possibile)..
non c'è un modo "sicuro" per svuotare il buffer di lettura??
da http://freeweb.supereva.com/sourcenet.freeweb/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 :)
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!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.