2013-08-25 21 views
6

Sto facendo un esercizio in C++ Primer e in pratica sto usando un'istruzione switch per contare il numero di vocali in un testo che inserisco.Controllare se un char è un newline

Inserisco il testo utilizzando un ciclo while.

while(cin >> ch) 

e procedere con i casi, a, e, i, o, u, incrementare una variabile intera per i rispettivi casi. Ora la prossima parte della domanda dice anche contare gli spazi, le schede e le nuove righe.

Ho provato a fare

case ' ': 

e così via con '\ t' e '\ n'. Ma sembra che non calcoli questi casi. Ho anche provato a utilizzare un valore predefinito e utilizzare un'istruzione if in caso contrario

default: 
    if(ch == ' ') 
     ++space; 

ecc. Ma questo non vale neanche. Ho anche provato a inserire i valori interi di "", "\ t", "\ n". Cosa sto facendo di sbagliato qui? Inoltre, so che se uso isspace() posso contare il totale combinato, ma ho bisogno di calcolarli individualmente. Non sono sicuro del motivo per cui il test di uguaglianza non farà il lavoro.

risposta

12

Per impostazione predefinita, l'input formattato dagli stream salta gli spazi bianchi iniziali. È necessario disabilitare il salto dei principali spazi bianchi o utilizzare una delle funzioni che non salterà spazi:

std::cin >> std::noskipws; // disables skipping of leading whitespace 
char c; 
while (std::cin.get(c)) { // doesn't skip whitespace anyway 
    ... 
} 
+0

C'è un modo più semplice di leggere negli spazi bianchi? A questo punto del libro la tecnica che hai citato non è stata trattata. Ci deve essere una soluzione più semplice. – Ares

+0

@Comrade: potresti usare 'std :: getline (std :: cin, str)' dove 'str' è un' std :: string'. Dovrebbe leggere gli spazi, ma i newline devono essere contati separatamente dal numero di chiamate riuscite a 'std :: getline()' (sebbene possa produrre un risultato errato se l'ultima riga termina con una nuova riga). Puoi anche 'std :: istreambuf_iterator ' per scorrere la sequenza di 'char's (che è probabilmente l'approccio più veloce) ma dubito che questo sia trattato nel libro. –

+0

La parte che conta le vocali mi impone di contare sia le minuscole che le maiuscole usando un caso per i due. Quindi nell'istruzione switch ho effettivamente un interruttore (tolower (ch)). Se uso getline (cin, str) dove str è una stringa, esiste una funzione analoga a tolower() che posso usare per una stringa? – Ares

1

Come detto da Dietmar, spazi bianchi vengono ignorati per impostazione predefinita. È possibile utilizzare cin.getline() per fornire il proprio delimitatore di stringa anziché i caratteri di spazio bianco. Direi che questo è un modo generalmente più semplice di leggere gli input rispetto all'utilizzo di cin.get().

Problemi correlati