1. Leerzeichen bis letztes Zeichen aus String herausfiltern



  • ich habe den Code

    while(eingabe != "exit")
        	{
    		cin>>eingabe;
                    size_t pos = eingabe.find_first_of(' ');
     		befehl = eingabe.substr(0, pos);
    
    		try
     		{
     			parameter = eingabe.substr(pos, eingabe.length());
        	    	}
    		catch(...){}
    
    		cout<<"Der Befehl ist: "<<befehl<<"\nund die Parameter: "<<parameter<<endl;
        	}
    

    wenn ich jetzt aber "hallo ich bins" eingebe kommt raus:

    Der Befehl ist: hallo
    und die Parameter:
    Der Befehl ist: ich
    und die Parameter:
    Der Befehl ist: bins
    und die Parameter:
    

    warum? und wie kann ich machen, dass nur das bis zum 1. Leerzeichen als Befehl gesehen wird und der Rest (also alles nach dem 1. Leerzeichen) als Paramter?



  • std::cin liest nur bis es auf ein Leerzeichen, Tabulator, etc. trifft.

    Probier mal std::getline(std::cin, eingabe) anstatt cin>>eingabe



  • fghfghfgh schrieb:

    std::cin liest nur bis es auf ein Leerzeichen, Tabulator, etc. trifft.

    Fast richtig. Verantwortlich dafür ist nicht std::cin, sondern operator>> .



  • Ganz einfach: >> ließt nur bis zum ersten Leerzeichen. Dh. deine Schleife wird für jedes Wort einmal ausgeführt und dann wird in diesem Word nochmal nach Leerzeichen gesucht, welche natürlich nicht gefunden werden.
    Nimm statt >> einfach getline:

    std::string input, value, params;
        while(value != "exit")
        {
            getline(cin, input);
    
            value = input.substr(0, input.find(' '));
    
            params = input.substr(input.find_last_of(' '));
    
            std::cout << "value: " << value << "params: " << params << "\n";
        }
    


  • Du koennest auch eine Kombination aus beiden machen:

    while (eingabe != "exit")
    {
       cin >> befehl;	// lese bis zum ersten whitespace character
       cin.ignore(1);	// ignoriere newline zeichen
       getline(cin, parameter);		// lese den rest der zeile als string
       cout << "\nBefehl: " << befehl << "\nParameter: " << parameter << "\n";
    }
    


  • ich meinte, cin.ignore(1) ignoriert das Leerzeichen/Whitespace, dass noch von cin>> im Puffer liegt.
    Meine Methode wuerde dir eine zusaetzliche Variable und das parsen des Strings ersparen :p



  • Morrison schrieb:

    Du koennest auch eine Kombination aus beiden machen:

    while (eingabe != "exit")
    {
       cin >> befehl;	// lese bis zum ersten whitespace character
       cin.ignore(1);	// ignoriere newline zeichen
       getline(cin, parameter);		// lese den rest der zeile als string
       cout << "\nBefehl: " << befehl << "\nParameter: " << parameter << "\n";
    }
    

    hey danke, das ist gut 😃


Anmelden zum Antworten