2010-12-08 3 views
1

Ich versuche, ein Programm zu schreiben, das die Anzahl der Zeichen in einer Zeichenfolge zurückgibt. Als ich mein Programm schrieb, bemerkte ich, dass es einen Fehler in der String-Klasse gibt.String.size() gibt eine falsche Zahl zurück, wenn Platz in der Zeichenfolge ist

Sagen mein Programm ist dies:

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string input; 

    cout << "Input string: "; 
    cin >> input 

    cout << "Number of characters: " << input.size() << endl; 

    return 0; 
} 

Wenn mein Eingang Test-String, ist, sollte ich die Nummer als die Ausgabe sehen.

jedoch der Ausgang I erhalten, ist dies:

Number of characters: 4 

Es scheint, wie die Größe() Methode funktioniert nicht, wenn es Platz in der Kette ist.

Meine Frage ist, gibt es eine andere Möglichkeit, die Anzahl der Zeichen in einer Zeichenfolge zu erhalten? Ich versuchte länge() Methode, aber das Ergebnis war das gleiche.

+3

Was ist wahrscheinlicher, ein Fehler in der Standardbibliothek oder ein Fehler in Ihrem Code? –

+4

'Ich habe bemerkt, dass es einen Fehler in der String-Klasse gibt.Nein gibt es nicht – Falmarri

+5

Regel 1: Es ist nicht der Compiler, du bist es. –

Antwort

13

Das ist, weil Ihr

cin >> input; 

nur mit dem ersten Leerzeichen liest auf. Wenn Sie die komplette Zeile erhalten möchten, verwenden Sie folgenden Code:

std::string s; 
std::getline(std::cin, s); 
+0

Tippfehler: "getline", nicht "getling". Aber es ist die richtige Idee. –

+0

Ich habe mehr oder weniger genau das hier geschrieben und dann ist mein WLAN gestorben, also +1 um mich zu schlagen. –

+0

@Ben: Yup, korrigiert es. Vielen Dank. –

5

Dies ist kein Fehler, und insbesondere hat eigentlich nichts mit der String-Klasse zu tun.

Es hat mit der istream Klasse (cin) zu tun. Der cin-Operator >> führt eine "formatierte Eingabe" durch, dh eine durch Leerzeichen begrenzte Eingabe. Nachdem Sie die Eingabetaste gedrückt haben, lesen Sie "Test" in eine Zeichenfolge aus und lassen "String" im Eingabepuffer. "Test" ist tatsächlich vier Zeichen lang.

Verwenden Sie std :: getline oder istream :: getline, um ganze Zeilen mit mehr Kontrolle zu lesen. Lesen Sie die Dokumentation für diese Methoden sorgfältig durch, da sie ein unterschiedliches Verhalten im Hinblick auf den Rest des Eingabestreams haben, was dann zu Ergebnissen führen kann, die Sie möglicherweise nicht erwarten, wenn sie mit oeprator >> usage gemischt werden.

+0

Danke für Ihre Hilfe! – pandascope

4

Dies ist ein Ergebnis der Bedeutung von cin >> input, die das Lesen beendet, wenn ein Leerzeichen gefunden wird. Wenn Sie bis zum Ende einer Zeile weiterlesen möchten, versuchen Sie getline.

+0

Danke für Ihre Hilfe! – pandascope

0

Nach korrekter Eingabe können Sie die Länge des Zeichen- oder Zeichenzeigers (char *) (einschließlich Leerzeichen) mit strlen (string_name) ermitteln. Dadurch wird die Länge zurückgegeben.

Verwandte Themen