[c]programma inverti stringa
salve ragazzi, ho ancora una volta un problema.
sto cercando di scrivere un programma che legga una sequenza di lettere e le stampi in ordine invertito.
Mi blocca una cosa fondamentale, l'acquisizione delle lettere !
ecco qui il codice , incompleto ovviamente.
ho utilizzato la var dim , per permettere all'utente di stabilire lui la dimensione della parola, e il ciclo for per l'acquisizione della stessa, ma succede una cosa strana.
all'aquisizione di dim,tutto ok, appena parte il ciclo
esce una cosa del genere :
e in più termina "prima", nel senso che se dim=4 , termina dopo due acquisizioni
cosa c'è che non va?
grazie mille.
sto cercando di scrivere un programma che legga una sequenza di lettere e le stampi in ordine invertito.
Mi blocca una cosa fondamentale, l'acquisizione delle lettere !

ecco qui il codice , incompleto ovviamente.
#include <stdio.h> main() { int dim; int i; printf("quante lettere?\n"); scanf("%d",&dim); char str[dim]; for (i=0 ; i<=dim ; i++){ printf("inserisci lettera\n"); scanf ("%c" , &str[i]); } }
ho utilizzato la var dim , per permettere all'utente di stabilire lui la dimensione della parola, e il ciclo for per l'acquisizione della stessa, ma succede una cosa strana.
all'aquisizione di dim,tutto ok, appena parte il ciclo
esce una cosa del genere :
inserisci lettera inserisci lettera
e in più termina "prima", nel senso che se dim=4 , termina dopo due acquisizioni




cosa c'è che non va?
grazie mille.
Risposte
La ragione risiede nell'utilizzo scorretto di scanf. Il formato %c non scarta i caratteri di a capo e spaziatura nell'input. Questi caratteri vengono quindi letti dal tuo programma. Quando inserisci il 4 della dimensione e vai a capo, questo carattere rimane nel buffer di lettura e sarà il primo carattere letto dal programma. In seguito inserirai un altro carattere e andrai nuovamente a capo causando la lettura di due caratteri (non uno). Alla fine stai effettivamente leggendo 4 caratteri, ma due sono uguali a '\n'. Nel caso in cui inserissi dim=5, riusciresti comunque a inserire solo 2 caratteri tu, ma ne verranno letti 5 di cui 3 uguali a '\n'. Una, a mio parere, brutta soluzione potrebbe essere quella di scrivere " %c" (nota la spazio..) invece di "%c" nella lettura del carattere. Questa soluzione impedisce però l'inserimento di un carattere di spazio come input del programma. Un'altra soluzione (basata sul presupposto che ogni lettera sia seguita da un carattere di a capo o spazio) sarebbe quella di usare "%*c%c" come stringa di formato dove %* significa "leggi un carattere ed ignoralo". Metodi migliori sono probabilmente basati su un più esplicito parsing dei valori passati in input.
Personalmente credo comunque che sarebbe più saggio leggere tutti i caratteri in blocco. Richiedere cioè l'inserimento dei caratteri uno dopo l'altro in un'unica stringa. Supponendo quindi che l'utente voglia invertire "Ciao mondo", si dovrebbe chiedere l'inserimento di "Ciao mondo" (senza virgolette) e poi premere invio.
Personalmente credo comunque che sarebbe più saggio leggere tutti i caratteri in blocco. Richiedere cioè l'inserimento dei caratteri uno dopo l'altro in un'unica stringa. Supponendo quindi che l'utente voglia invertire "Ciao mondo", si dovrebbe chiedere l'inserimento di "Ciao mondo" (senza virgolette) e poi premere invio.
ciao apatriarca, anzi tutto ti dico grazie per la tua disponibilità.
in secondo luogo, come posso far in modo che si inserisca direttamente la parola piuttosto che carattere per carattere? grazie
in secondo luogo, come posso far in modo che si inserisca direttamente la parola piuttosto che carattere per carattere? grazie
Puoi usare per esempio qualcosa come fgets, oppure scanf con %s (possibilmente inserendo in qualche modo la lunghezza nella stringa di formato) oppure facendo un ciclo in cui ad ogni iterazione leggi un singolo carattere.
Ciao Apatriarca, per leggere una stringa non si può usare una funzione del genere?
Ovviamente LUNG_STRING va messa nei define e si deve tener conto del '\0' per la lunghezza
Ovviamente LUNG_STRING va messa nei define e si deve tener conto del '\0' per la lunghezza

int leggi_stringa(char str[LUNG_STRING]) { int indice,carat; indice=0; while((carat=getchar())!='\n') if(indice<LUNG_STRING) { str[indice]=(char) carat; indice++; } str[indice]='\0'; return(carat); }
Per come è definita la tua funzione ha più o meno lo stesso comportamento di fgets ma è meno flessibile.. Ha il vantaggio/svantaggio di completare la lettura della riga anche quando questa non sia stata copiata interamente nel buffer e non inserisce il carattere '\n' nella stringa. Utilizza un puntatore per la stringa e passa la dimensione come parametro per rendere il tutto più flessibile.
Ok, quindi la funzione vera sarebbe questa?
int leggi_stringa ( char stringa[], int *p_lung_stringa= { int indice, carat; indice=0; while(((carat=getchar())!='\n')&&(carat!=EOF)) if(indice<LUNG_STRING) { stringa[indice] = (char)carat; indice++; } stringa[indice]='\0'; *p_lung_stringa = indice; return(carat); /* restituisce EOF oppure \n */ }
No, intendevo dire di passare la lunghezza massima della stringa (cioè nel tuo caso LUNG_STRING) come argomento in modo da poterla eventualmente scegliere a runtime. Inoltre restituirei indice dalla funzione invece di carat (ma è una scelta personale).
"apatriarca":
No, intendevo dire di passare la lunghezza massima della stringa (cioè nel tuo caso LUNG_STRING) come argomento in modo da poterla eventualmente scegliere a runtime. Inoltre restituirei indice dalla funzione invece di carat (ma è una scelta personale).
Sisi, questo è solo il prefabbricato di una "leggi_stringhe", poi in base alla necessità si modifica
