2017-05-26 3 views
0

Können wir eine Zeichenfolge wie diese in C++ akzeptieren und drucken? Dieser Code funktioniert nicht richtig.Akzeptieren und Drucken einer Zeichenfolge

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

main() 
{ 
string a;char ch; 
for(int i=0;i<5;i++) 
{cin>>ch; 
a[i]=ch; 
} 
a[5]='\0'; 
cout<<a; 

} 

Ich bin in der Lage einzelne Elemente wie a [1] zu drucken, a [2], usw., aber nicht in der Lage das gesamte string.Why zu drucken?

+0

https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – ChemiCalChems

Antwort

0

Wenn Sie eine Zeichenfolge aufnehmen möchten, können Sie Folgendes tun.

#include <iostream> 

int main() { 
    std::string str; 

    std::getline(std::cin, str); 

    std::cout << str; 
} 

Auch C++ automatisch Null beendet alle Zeichenfolgenliteral Sie verwenden.

+0

Sir, danke Sie haben sehr viel für die Antwort, aber ich habe am Ende einen nullterminierten String hinzugefügt, aber es funktioniert nicht, können wir nicht auf Elemente eines Strings zugreifen use [] operator? Bin ich nicht direc Hinzufügen von Elementen? Und die Eingabe des Problems, das ich bin, beinhaltet Elemente mit einem Leerzeichen zwischen 1 2 3 4 eingegeben, so wie man diese Elemente akzeptiert und speichert sie in einer Zeichenfolge? –

+0

Warum möchten Sie eine Zeichenfolge verwenden? Warum nicht einen Vektor verwenden und Zahlen zurückschieben? – ChemiCalChems

0

Nun, es ist nicht wirklich in der Nähe von Best-Practices, aber um Ihr sofortiges Problem zu beheben, müssen Sie die Größe tatsächlich ändern.

#include<iostream> 
#include<string> 

main() 
{ 
    std::string a;char ch; 
    a.resize(5); // <--- reserves memory 
    for(int i=0;i<5;i++) 
    { 
    std::cin>>ch; 
    a[i]=ch; 
    } 
    a[5]='\0'; //<-- unnecessary 
    st::cout<<a; 
} 

alternativ können Sie die Zeichen

#include<iostream> 
#include<string> 

main() 
{ 
    std::string a;char ch; 
    for(int i=0;i<5;i++) 
    { 
    std::cin>>ch; 
    a+=ch; 
    } 
    std::cout<<a; 
} 
+0

Sehr geehrter Herr, vielen Dank für die Antwort, aber warum sollten wir es tun, Herr? Zeichnet nicht automatisch Zeichenfolge Speicher und erstreckt sich bei Bedarf? –

+0

@AjaySabarish, wenn Sie 'append' oder' operator + = 'oder etwas ähnliches verwenden, aber der [' operator [] '] (http://en.cppreference.com/w/cpp/string/basic_string/operator_at) doesn 't do any bounds checking – PeterT

+0

Würden Sie nicht lieber 'reserve' statt' resize' verwenden?'resize' wird auf Nullen initialisiert,' reserve' reserviert nur den Speicherplatz ohne Initialisierung –

-1

anhängen können Sie die Zeichenfolge drucken wie diese

#include<iostream> 
#include<string> 
using namespace std; 
int main() 
{ 
string a;char ch; 
for(int i=0;i<5;i++) 
{ 
cin>>ch; 
a.push_back(ch); 
} 
a.push_back('\0'); 
cout << a; 
return 0; 
} 
+0

verwenden a.push_back (ch); statt a [i] = ch; – Amol

+0

Dann bearbeiten Sie bitte Ihre Antwort entsprechend, um weitere Missverständnisse zu vermeiden, bitte. – ChemiCalChems

+0

vielen Dank, mein Herr. –

0

Das eigentliche Problem hier ist nicht, dass Sie nicht lesen können oder nicht können Die Zeichenfolge wird gedruckt, wenn Sie in nicht zugewiesenen Speicher schreiben. operator[], das ist, was Sie verwenden, wenn Sie etwas wie a[i]=ch tun, macht keine Art von Grenzprüfung und damit verursachen Sie undefiniertes Verhalten. In meiner Maschine wird beispielsweise nichts gedruckt.

Kurz gesagt, müssen Sie sicherstellen, dass Sie Platz haben, um Ihre Zeichen zu schreiben. Wenn Sie sicher sind, dass Sie 5 Zeichen lesen werden (und eine \ 0 am Ende hinzufügen, so dass es 6 in der Länge), könnten Sie so etwas tun:

std::string a(6, '\0') 

Wenn Sie unsicher sind, wie viele Zeichen, die Sie lesen werden, std::string ist bereit, Speicherplatz nach Bedarf zuzuweisen, aber Sie müssen std::push_back verwenden, um ihm eine Chance zu geben, dies zu tun. Ihre Schleife Inhalt wäre so etwas wie:

cin >> ch; 
a.push_back(ch); 

Wenn Sie unsicher sind, wo das std::string Objekt herkommt (wie in dieser Bibliothek Code ist, der eine std::string als Argument akzeptiert, könnten Sie at(i) (zB a.at(i) = ch statt a[i] = ch), die eine Ausnahme auslöst, wenn es außerhalb des zulässigen Bereichs.

Verwandte Themen