2016-03-25 9 views
0

Ich habe einen Code geschrieben, der diese Aufgabe zu einem gewissen Grad erfüllt. Aber ich würde gerne meinen Code so ändern, dass ich so viele String-Eingaben speichern kann, die der Benutzer in den Vektor eingeben möchte.C++ - Speichern der Benutzereingabestring getrennt durch Kommas in Vektor

Hier ist mein Code:

#include <iostream> 
#include <cstring> 
#include <vector> 

using namespace std; 

int main() 
{ 
string input = ""; 
cout << "Input: "; 
cin >> input; 
string a,b; 

for(int i = 0; i<input.size(); i++) 
{ 
    if(input.at(i)==','){ 
     a=input.substr(0,i); 
     b=input.substr(i+1); 
    } 
} 

vector<string> objects; 
objects.push_back(a); 
objects.push_back(b); 

for (int k = 0; k < 2; k++) { 
    cout << objects[k] << endl; 
} 

return 0; 
} 

Bisher kann sie nur erkennen und zwei Eingänge durch Komma getrennt speichern. Ich bin sehr neu im Codieren, also könnte mir jemand einen Weg zeigen, dies zu einer Schleife zu machen und so viele Eingaben wie der Benutzer eingibt?

Vielen Dank.

+0

Dies wird für nicht funktioniert 'das ist meine Liste, a, b, c, d , Ende der Zeile. – Shark

+1

Das Problem liegt in Ihrer for-Schleife; Sie drücken A und B nicht nach jeder Iteration in den Vektor. Sie müssen die Zeichenfolgen am Ende jeder Iteration in den Vektor einfügen und dann wiederholen. Es gibt auch kleinere Probleme in Ihrer Logik, wie @Shark aufgezeigt hat. –

Antwort

1

Sie müssen Ihren Code ändern, um für eine beliebige Anzahl von Benutzereingaben zu arbeiten. Die Logik besteht darin, jede Teilzeichenfolge zwischen den Kommas in vector zu schieben.

vector<string> objects; 

for(int i = 0,j=0; i<input.size(); i++) 
{ 
    if(input.at(i)==',' || input.at(i)=='\0'){ 
     objects.push_back(input.substr(j,i-j)); //pushing the sub string 
     j=i+1; 
    } 
} 

Um den Vektor zuerst zu drucken, müssen Sie die Größe des Vektors finden, dann iterieren Sie einfach, um es zu drucken.

//display 

int l=objects.size(); 
for (int k = 0; k < l; k++) { 
    cout << objects[k] << endl; 
} 

Hinweis: Wenn Sie Ihren Code wollen für Strings mit Leerzeichen dazwischen, zum Beispiel zu arbeiten: a ,b ,c ,d dann getline(cin,input); verwenden Eingabe von Benutzer zu nehmen.

0

Sie können running code here oder als github gist sehen.

// Example program 
#include <iostream> 
#include <string> 
#include <vector> 
#include <string> 

void ParseCSV(
    std::vector<std::string>& output, 
    const std::string& csv) 
{ 

    int q = 0; 
    int p = csv.find(","); 
    while(p != -1) 
    { 
     output.push_back(csv.substr(q,p-q)); 
     q = p+2; 
     p = csv.find(",",q); 
    } 

    // The terminating comma of the CSV is missing 
    // so we need to check if there is 
    // one more value to be appended 

    p = csv.find_last_of(","); 
    if(p != -1) 
    { 
     output.push_back(csv.substr(p+2)); 

    } 
    else 
    { 
     // there was no comma 
     // this could be because the list is empty 
     // it could also be because there is just one element in the list 

     if(csv.length() > 1) 
      output.push_back(csv); 
    } 
} 

int main() 
{ 
    std::string test("this is my list, a, b, c, d, end of line"); 
    std::vector<std::string> split; 
    ParseCSV(split, test); 
    for(auto& s : split) 
     std::cout << s << std::endl; 

} 

Wie von Christophe vorgeschlagen, ist die Verwendung von stringstream viel besser. Keine Sonderfallbehandlung erforderlich! Ich benutze eine while-Schleife - es scheint klarer zu sein, was passiert.

void ParseCSV2(
    std::vector<std::string>& output, 
    const std::string& csv) 
{ 
    std::stringstream sst(csv); 
    std::string a; 
    while(getline(sst, a, ',')) 
     output.push_back(a); 
} 
2

Es gibt viel einfachere Ansätze sind eine Eingabezeichenfolge mit stringstreams zu analysieren:

string a; 
vector<string> objects; 

for(stringstream sst(input); getline(sst, a, ',');) // that's all ! 
    objects.push_back(a); 

copy (objects.begin(), objects.end(), ostream_iterator<string>(cout," ; ")); // display all 

Online demo

Verwandte Themen