die Erkennung von Leerzeichen, \t, \n, usw.
Arbeite ich mit c++ primer 5th edition. die übung in Kapitel 5 nennt die Folgen:
Übung 5.11: Schreiben Sie ein Programm, dass zählt die Anzahl der Leerzeichen, tabs und Zeilenumbrüche zu Lesen.
Ich versucht, zu tun, als übung 5.11 es mit dem code unten. Aber der code nicht funktioniert. Kann mir jemand einige Beispiele nennen, wie ich den korrigieren Sie den code, so dass, wenn die Eingabe gelesen, dass der Zähler unsigned int cnt = 0;
wird iteriert, richtig?
#include "stdafx.h"
#include <iostream>
int main(){
unsigned int cnt = 0;
char c1;
while (std::cin >> c1)
if (c1 == '\t' || c1 == '\n' || c1 == ' ')
++cnt;
std::cout << "The number of spaces,tabs, newlines are: " << cnt << std::endl;
system("pause");
return 0;
}
'/n'
solche Sache nicht existiert. Ich glaube, Sie meinte'\n'
.- Ist das ein Tippfehler?
c1 == '/n'
. Es solltec1 == '\n'
. - Was genau meinst du mit "der code nicht funktioniert?" Welche Ausgabe bekommst du, und was erwarten Sie?
- Ich schlage vor, Sie immer kompilieren mit
-Wall -Wextra -pedantic
, und beseitigen Sie alle Warnungen. Es soll davor gewarnt haben, die Sie über die Verwendung einer multi-character-Konstante. - Nicht
system("pause")
Lesen einer Zeile vonstd::cin
statt. - sicherlich meinst du
ignore()
etwas wie instd::cin.ignore();
? Beachten Sie, dass sowohl eine Zeile zu Lesen und ignorieren, alles andere hat die etwas unglückliche problem, dass es auszuschließen erfolgreich, wenn die Letzte operation aufstd::cin
war ein formatiertes Lesen: wenn dem so ist, solltest du zunächst ignorieren wollen, das nachfolgende Zeichen auf der Linie mitstd::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
. Ich jedenfalls glaube nicht, dasssystem("pause");
sollte verwendet werden, aber wir müssen wirklich eine gute alternative. Auchstd:cin.ignore(std::cin.rdbuf()->in_avail())
ist nicht wesentlich besser... - vielleicht sollten Sie einen Blick auf cplusplus.com/doc/tutorial/basic_io im Abschnitt "cin und Streicher"
- Dan Korn: was ich damit meine-fail ist, der code nicht count(cnt) der tab, Leerzeichen oder neue Zeile als ich einen Versuch, um den code zu erhalten, um zu tun. Was erwarte ich als Ausgabe für das Beispiel: Input = "Dies ist ein test". die Ausgabe sollte ""Die Anzahl der Leerzeichen,tabs, newlines sind: 3", da gab es 3 Leerzeichen in der Eingabe. @Havenard: ja, es ist ein Tippfehler. ich will fix it in the post. @ ZMBQ: ich bin mit microsoft VB 2013 express. ich verwendet
system("pause");
pause das terminal-Bildschirm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Weg zum klassifizieren von Zeichen in C++ sind Funktionen von
<cctype>
oder die Funktionen von<locale>
: es gibtstd::isspace()
Funktionen in beiden. Beachten Sie, dass Sie nur positiveint
Werte zu den Funktionen aus<cctype>
, d.h., zu bestimmen, ob einchar c
ist ein Raum, die Sie verwenden würden:Nur mit
std::isspace(c)
führen zu undefiniertem Verhalten, wennchar
signiert undc
ist ein negativer Wert. Auf typische Systeme, die nicht-ASCII-Zeichen (oder mehrere bytes der UTF-8-Codierung) auch negative Werte verwenden.Die Probleme in deinem ursprünglichen code:
'/n'
ist kein gültiges Zeichen-literal; Sie meinte wohl zu verwenden'\n'
.'\r'
(carriage return) und'\v'
(vertical space)std::cin >> std::noskipws;
. Persönlich würde ichstd::istreambuf_iterator<char>
um die Charaktere. Ich denke, das ist Ihre primäre problem.Den pragmatischen Ansatz zu zählen Räume ist wahrscheinlich so etwas wie dieses:
STD::noskipws
um den code arbeiten. danke. der rest von Ihr vorgeschlagene code ist ein bisschen weiter als ich habe es in C++ so weit. also hielt ich es einfach, bis das Buch lehrt mich mehr. Allerdings! ich danke Ihnen sehr für Ihre Hilfe.noskipws
ist zu tuncin.get(c1)
.isspace
. Noch nützliche Infos natürlich