2012-06-08 12 views
6

Come ho capito, l'operatore di estrazione salta lo spazio bianco all'inizio e si ferma quando incontra uno spazio bianco o una fine del flusso. i noskipws possono essere usati per smettere di ignorare gli spazi bianchi iniziali.Effetto di noskipws sul cin >>

Ho il seguente programma in cui ho usato noskipws.

#include <iostream> 
using namespace std; 

int main() 
{ 
    char name[128]; 

    cout<<"Enter a name "; 
    cin>>noskipws>>name; 
    cout<<"You entered "<<name<<"\n"; 

    cout<<"Enter another name "; 
    cin>>name; 
    cout<<"You entered "<<(int)name[0]<<"\n"; 

    return 0; 
} 

Le mie domande sono:

  1. Se entro "John", come il primo input, poi il secondo cin >> operazione non aspettare per l'input e non copia nulla al cioè di destinazione il nome dell'array. Mi aspettavo che il secondo cin >> trasferisse almeno una nuova riga o la fine del flusso, invece di impostare semplicemente la stringa di destinazione da svuotare. Perché sta succedendo ?

  2. La stessa cosa si osserva quando inserisco "John Smith" come input per la prima istruzione cin >>. Perché la seconda istruzione cin >> copia lo spazio o "Smith" nella variabile di destinazione?

Ecco l'output del programma:

Enter a name John 
You entered John 
Enter another name You entered 0 


Enter a name John Smith 
You entered John 
Enter another name You entered 0 

Grazie !!!

+0

Spero che tu sappia che si programma può produrre buffer overflow molto facilmente. Nel codice di produzione, non dovresti usare 'std :: cin' per scrivere in un array di caratteri. Usa invece 'std :: string'. – smerlin

+0

Questo è vero. Il codice sopra era solo a scopo illustrativo. L'utilizzo di cin.width o cin.getline può evitare alcuni dei problemi di overflow, ma come hai detto std :: string sarebbe il migliore. Ho dato il codice di esempio sopra solo per mostrare cosa stavo cercando di chiedere. –

risposta

10

L'algoritmo di base per >> di una stringa è:

skip whitespace 
read and extract until next whitespace 

Se si utilizza noskipws, quindi il primo passo è saltato. Dopo la prima lettura, sei posizionato su uno spazio bianco, così le prossime (e tutte le successive) letture si interromperanno immediatamente, non estraendo nulla.

>> a una stringa non inserirà mai spazi bianchi nella stringa. Più in generale, l'utilizzo di >> con noskipws è problematico, poiché lo spazio bianco è sempre un separatore per >>; potrebbe essere logico utilizzarlo puntualmente, ma in genere dovrebbe essere ripristinato immediatamente dopo che è stato utilizzato. (Il caso una volta in cui potrebbe avere senso è quando si utilizza >> a un char. In questo caso, il flusso sempre estratti di un carattere.)

+0

Ok, hai capito. Ma sono confuso sul motivo per cui non è stato inserito "John Smith" perché l'operatore >> copia "Smith" nella seconda operazione di input. Perché "Smith" è scomparso completamente dal flusso di input e anche allora la seconda operazione non ha atteso un input. –

+2

@AchintMehta Perché il prossimo carattere da leggere è uno spazio bianco, non il 'S' in' "Smith" '. Hai detto di non saltare lo spazio bianco, quindi non lo fa. Quindi inserisce fino a ma non includendo lo spazio bianco successivo, che è immediato. Il '' Smith ''non scompare, basta non leggerlo. E non puoi leggerlo con '>>', ad eccezione di '>>' in un 'char', dato che tutti gli altri' >> 'si fermeranno ai primi spazi bianchi, senza estrarre nulla e non avanzando nella posizione di input. –

Problemi correlati