2013-08-25 32 views
6

Ich mache eine Übung in C++ - Primer und im Grunde verwende ich eine switch-Anweisung, um die Anzahl der Vokale in einem Text zu zählen, die ich eingegeben habe.Überprüfen, ob ein Char ein Zeilenumbruch ist

Ich gebe den Text mit einer While-Schleife ein.

und mit den Fällen a, e, i, o, u fortfahren und eine Integer-Variable für die jeweiligen Fälle inkrementieren. Nun werden im nächsten Teil der Frage auch die Leerzeichen, Tabulatoren und Zeilenumbrüche gezählt.

ich versuchte

case ' ': 

und so weiter unter Verwendung '\ t' und '\ n' tun. Aber es scheint, als würde es diese Fälle nicht berechnen. Ich versuchte auch nur einen Standard und mit einer if else Anweisung

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

usw.usw. Aber das geht auch nicht weiter. Ich habe auch versucht, die Integer-Werte von '', '\ t', '\ n' einzugeben. Was mache ich hier falsch? Außerdem weiß ich, dass ich, wenn ich isspace() verwende, die kombinierte Summe zählen kann, aber ich muss jede einzeln berechnen. Ich bin nicht sicher, warum der Gleichheitstest die Arbeit nicht erledigen wird.

Antwort

12

Standardmäßig formatiert formatierte Eingabe von Streams führende Leerzeichen. Sie müssen entweder deaktivieren Überspringen von führenden Leerzeichen oder eine der Funktionen verwenden, die Räume überspringen nicht:

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

Gibt es eine einfachere Möglichkeit zum Einlesen der Leerzeichen? An dieser Stelle des Buches wurde die von Ihnen erwähnte Technik nicht behandelt. Es muss eine einfachere Lösung geben. – Ares

+0

@Comrade: Sie könnten 'std :: getline (std :: cin, str)' verwenden, wobei 'str' eine' std :: string' ist. Es würde die Leerzeichen lesen, aber Zeilenumbrüche müssen separat nach der Anzahl der erfolgreichen Aufrufe von 'std :: getline()' gezählt werden (obwohl es zu einem falschen Ergebnis führen kann, wenn die letzte Zeile mit einem Zeilenende beendet wird). Sie können auch 'std :: istreambuf_iterator ', um über die Folge von 'Char's zu iterieren (was wahrscheinlich der schnellste Ansatz ist), aber ich bezweifle, dass dies in dem Buch behandelt wird. –

+0

Der Teil, der die Vokale zählt, erfordert, dass ich beide Groß- und Kleinbuchstaben mit einem Fall für die beiden zähle. Also in der switch-Anweisung habe ich eigentlich switch (tolower (ch)). Wenn ich getline (cin, str) verwende, wo str eine Zeichenkette ist, gibt es eine analoge Funktion zu tolower(), die ich für eine Zeichenkette verwenden kann? – Ares

1

Wie Dietmar sagte, weißen Räumen standardmäßig übersprungen werden. Sie könnten cin.getline() verwenden, um anstelle von Leerzeichen ein eigenes Zeichenfolgentrennzeichen anzugeben. Ich würde sagen, dies ist eine allgemein einfachere Art, Eingaben zu lesen, als die Verwendung von cin.get().

Verwandte Themen