()
Newbie
Messaggi:
Iscritto:
|
E' possibile far si che quando vengono inseriti degli spazi tramite scanf o cin evitare che nell'array di char venga ricevuta la stringa precedente allo spazio
Es(console):
char arraychar[N]
Input:ciao bob(cin>>arraychar)
Output:ciao(cout<<arraychar)
spero di essere stato chiaro...
grazie
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
|
|
jack92 (Member)
Pro
Messaggi: 100
Iscritto: 06/08/2010
|
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Ho letto la procedura, e a mio avviso è confusa e inattendibile.
Legge dati da tastiera o file?
Non fa alcun controllo dimensionale sul puntatore passato.
In c++, esistono metodi migliori per risolvere il problrma. |
|
jack92 (Member)
Pro
Messaggi: 100
Iscritto: 06/08/2010
|
Postato originariamente da Poggi Marco:
Ho letto la procedura, e a mio avviso è confusa e inattendibile.
Legge dati da tastiera o file?
Non fa alcun controllo dimensionale sul puntatore passato.
In c++, esistono metodi migliori per risolvere il problrma. |
Legge dati da tastiera o file?
Se non ho capito male legge il buffer della tastiera (quello che hai appena scritto),contenuto nel file stdin e lo copia nella stringa che gli passi come parametro
In c++, esistono metodi migliori per risolvere il problrma
Indubbiamente ma avevo letto che gli servia una funzione relativa alla "scanf" o alla "cin" che gli avrebbe letto gli spazi ed ho pensato alla "gets" , perchè la uso personalmente Ultima modifica effettuata da jack92 il 15/08/2010 alle 11:01 |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Riporto la funzìione:
Codice sorgente - presumibilmente VB.NET |
char *gets(char *s)/*<!-- Please don't change me without commenting on the Talk page. -->*/ { int i, k = [[getchar]](); /* Ritorna NULL se l'input non esiste */ if (k == EOF) return NULL; /* Legge e memorizza i caratteri fino alla fine del file */ for (i = 0; k != EOF && k != '\n'; i++) { s[i] = k; k = getchar(); /* If a read error occurs, the resulting buffer is not usable. */ if (k == EOF && !feof(stdin)) return NULL; } /* Null-terminate and return the buffer on success. The newline is not stored in the buffer. */ s[i] = '\0'; return s; }
|
Il ciclo continua finchè k è diverso dal carattere '\n' o EOF, inoltre controlla che lo stream di input (stdin) sia diverso da EOF tramite la funzione feof ( vedi
http://www.cplusplus.com/reference/clibrary/cstdio/feof/&n ...; )
Ora, non essendo stato aperto nessun stream, tale controllo darà esito aleatorio.
Fa terminare la funzione, restituendo NULL e non inserisce il carattere '\0' nel vettore passato.
In alternativa, si può semplificare in questo modo:
Codice sorgente - presumibilmente C++ |
void LeggiFrase(char *s, int fine) // fine è la dimensione del vettore { int i=0, k=0; while ((k=getchar()) != '\n') { if (i<fine) s[i++]=k; } s[i]='\0'; }
|
Ultima modifica effettuata da Poggi Marco il 15/08/2010 alle 14:47 |
|
()
Newbie
Messaggi:
Iscritto:
|
mi da un problema... quando eseguo il programma non mi da tempo di inserire nessuna stringa... vi posto l'intero codice così provate se a voi da lo stesso errore:
Codice sorgente - presumibilmente C++ |
#include <cstdlib> #include <iostream> #include <windows.h> #include <fstream.h> #include <string.h> #define N 117 using namespace std; char stringa[N]; char stringa1[N*3]; int num[N]; int num1[N]; int temp[N]; int j=0; int g; int x=1; char scelta; char azzera; fstream dati; fstream dati1; string codici=""; int redo; int main() { do { cout<<"Azzerare Codice.txt?(1=s)(2=n)"; cin>>azzera; if(azzera==49||azzera==50) if(azzera==49) { dati1.open("Codice.txt",ios::out); dati1.close(); redo=0; } else { dati1.open("Codice.txt",ios::in); dati1>>codici; dati1.close(); redo=0; } else { system("cls"); cout<<"Valore inserito errato"<<endl; redo=1; } }while(redo); dati.open("Codice.txt",ios::out); dati<<codici<<endl; cout<<"Sostituire agli spazi _"<<endl; j=0; for(int i=0;i<N;i++) stringa[i]=0; cout<<"Inserire stringa da codificare: "; cin.getline(stringa,N); for(int i=0;i<N;i++) num[i]=stringa[i]; for(int i=0;i<N;i++) if(num[i]!=0) { num[i]=num[i]+58; num[i]=num[i]*2; } for(int i=0;i<N;i++) if(num[i]!=0) { cout<<num[i]; dati<<num[i]; } cout<<endl; dati.close(); system("PAUSE"); }
|
grazie...
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Ciao! Ho letto il tuo programma, e ho trovato un semplice errore di gestione del buffer da tastiera.
Infatti quando richiedi il carattere azzera, solo il primo carattere viene memorizzato, mentre i successivi rimangono nel buffer.
Per ovviare al problema, basta aggiungere cin.ignore().
|
|
()
Newbie
Messaggi:
Iscritto:
|
Grazie
Finalmente funziona come volevo...
Scusate per il banale errore, ma sono ancora un principiante
|
|