2012-09-19 22 views
5

Sono al laboratorio di informatica e nessuno dei tutor può capire perché il mio getline non funzioni correttamente. Non memorizza correttamente le informazioni (memorizza solo 1 o 2 lettere). Qualcuno sa perché è così?Perché getline è così incoerente?

void addMovie(Inventory movie[], int &count) 
{ 
    string s; 
    int i; 

    cout << "Please enter the SKU " << endl; 
    cin >> i; 
    movie[count].sku = i; 

    cout << "Please enter the name of the movie you wish to add " << endl; 

    cin.ignore('\n'); 
    getline(cin, s, '\n'); 
    movie[count].title = s; 

    count++; 
} 
+2

Come nota, probabilmente si dovrebbe utilizzare un qualche tipo di contenitore standard di un array di C-stile. Non sembra che tu stia facendo dei limiti controllando qui. – tadman

+0

Non devi neanche mettere '\ n'' sul 'getline'. È il delimitatore predefinito. – chris

risposta

8

std::istream::ignore (cioè cin.ignore()) 's primo argomento è il numero di caratteri da scartare. Il valore di '\n' ha un codice ASCII di 10, in modo che '\n' venga convertito implicitamente in un numero intero (molto probabilmente 10, ma potrebbe essere diverso se viene utilizzata una codifica diversa - EBCDIC utilizza 21), ed è il numero di caratteri che vengono ignorati lasciando alcuni rimasti.

quello che realmente vuole è quello di eliminare il maggior numero possibile fino a trovare una nuova riga:

#include <limits> //for numeric_limtis 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

Il compilatore non dovrebbe aver avvisato di questa conversione implicita? –

+0

@muntoo, No, è una conversione comune ben definita dallo standard. C++ non distingue 'int' e' char' come tipi separati che richiedono la garanzia dell'utente per la conversione, come fa Java, quindi entrambi possono essere usati in modo intercambiabile. Potete vederlo su funzioni come 'tolower', che prende e restituisce un' int'. Quello viene da C, però, come credo. L'intera faccenda tra inte e caratteri potrebbe venire da C, ma non riesco a ricordare. Probabilmente c'è una buona discussione da qualche parte su SO. – chris

+0

@muntoo, solo per indicare un esempio, questo è un eccellente motivo per 'std :: string' che non ha un costruttore che prende un singolo carattere. Se hai fatto 'std :: string str (10); 'aspettandoti una stringa con una lunghezza di 10, sarebbe implicitamente convertito in un carattere e lo userei invece. Funziona anche il contrario. Un'altra cosa che ho appena ricordato è che i caratteri letterali di C avevano il tipo 'int', non' char'. Dimenticavo se C aveva "char" in quel momento, ma anche averlo, qualcosa come "tolower" avrebbe dovuto prima convertire il carattere letterale in un 'char'. – chris