String clearen?



  • also ich hab da ein problem,

    ich hab ne function geschrieben, die zunächst prueft, ob die eingabe eine zahl ist, oder nicht und den string anschließend in einen double konvertiert.

    wenn ich die function nun zwei mal aufrufe (siehe code) und beim ersten mal folgenden string eingebe: "123 234" dann wird beim ersten aufruf 123 returned und beim 2. versuch 234 returned, ohne dass ich jedoch eine 2. eingabe gemacht habe! ich moechte, dass der string beim erneuten aufruf leer ist und wieder eine normale eingabe gemacht werden kann!

    ciao, ben

    www.skyscanner.de

    double eingabe(void)
      {
        char eingabe[] = "";
        std::string eingabestring=("");
        char *ep1;
        long double zahl;
        int stringlaenge;
        int digit;
        int kommazaehler;
        cin>>eingabe;
    	eingabestring=eingabe;
    	stringlaenge=eingabestring.length();
    
    	digit=1;
    	kommazaehler=0;
    
    	for (int k=0;k<=stringlaenge-1;k++){
    	if(isdigit(eingabe[k])==0 & (int)(eingabe[k])!=46) digit=0;
    	if((int)(eingabe[k])==46) kommazaehler++;
    	}
    
        if(digit==1 & kommazaehler<=1){
        zahl = strtod(eingabe, &ep1);
        cout << "Zahl: "<<zahl;
    	return zahl;
    	}
    
        if (digit==0 || kommazaehler >= 2) cout<<"Eingabe ungueltig\n"; //canceln wenn mehr als 2 kommas oder nicht-zahlen eingegeben wurden
    
      }
    
    int main(){
    eingabe();
    eingabe();
    return 0;
    }
    


  • Du machst es dir hier unnötig schwer. Ich würde zur Konvertierung einfach einen stringstream nehmen und den alles prüfen lassen.
    Warum hast du neben eingabestring noch eingabe?
    Beim if in der Schleife hast du ein & zuwenig.
    Nach dem Ende der Funktion kann noch ein newline im Tatstaturpuffer sein, so dass die nächste Eingabe überlesen wird.
    besser so

    double eingabe()
    {
        std::string eingabestring; // wird automatisch mit "" initialisiert
        cin >> eingabestring; // geht auch mit string
        cin.ignore();  //letztes Newline entfernen
        double Zahl;
        stringstream Str;
        Str << eingabestring; // String in den stringstream
        if( Str >> Zahl) // Zahl auslesen wenn möglich
        {
          cout << "Zahl: "<<zahl;
          return Zahl;
        else
        {
           cout<<"Eingabe ungueltig\n";
           return 0.0;
        }
    }
    


  • erstmal vielen dank!

    deine function genau das gleiche, wie meine - mein problem ist leider bestehen geblieben, wenn du "12 12" eingibst passiert das gleiche wie mit dem alten

    ich hab das ganze ein wenig abgewandelt und hole den string nun ueber den getline befehl!
    der fehler den ich vorher hatte ist dann weg - aber wenn ich nun "12..1" eingebe
    returned die function 12. ich haette dies aber gern als ungueltige eingabe gedeutet!

    ciao, ben

    prog

    double eingabe()
    {
        std::string eingabestring; // wird automatisch mit "" initialisiert
        getline(cin,eingabestring);
        //cin.ignore();  //letztes Newline entfernen
        double Zahl;
        stringstream Str;
        Str << eingabestring; // String in den stringstream
        if( Str >> Zahl) // Zahl auslesen wenn möglich
        {
          cout << "Zahl: "<<Zahl;
          return Zahl;
        }
        else
        {
           cout<<"Eingabe ungueltig\n";
           return 0.0;
        }
    }
    


  • ersetze das hier

    cin >> eingabestring;
    

    mal durch das hier

    getline(cin, eingabestring);
    

    Warum das andere nicht funktioniert muß ich erst noch rausbekommen.



  • Machs mal so

    double eingabe()
    {
        std::string eingabestring; // wird automatisch mit "" initialisiert
        getline(cin.eingabestring);
        double Zahl(0.0);
        stringstream Str;
        Str << eingabestring; // String in den stringstream
        if(Str >> Zahl && Str.eof()) // Zahl auslesen wenn möglich
        {
          cout << "Zahl: "<< Zahl << endl;
        } else
        {
           cout << "Eingabe ungueltig\n" << endl;
         }
        cin.clear(); // löscht die Fehlerflags in ci
        cin.ignore(cin.rdbuf()->in_avail()); // entfernt restliche Zeichen aus der Eingabe
        return Zahl;
    }
    

    Das Einlesen über den Stringstream ist fehlertoleranter als ich erwartet habe. Wenn allerdings das Zeichen, und nur das Zeichen drin steht, wird eof zu true. Das sieht mir aber irgendwie nach einem schrägen Workaround aus.
    Ich habs mal mit boost::lexical_cast probiert. Der wirft bei 12..1 eine Exception.

    Ach so
    ignorier mal meinen vorigen Post. Ich habe irgendwie deinen letzten nicht vollständig gelesen. Ist wohl zu warm hier (36°C im Büro).



  • ich hab das jetzt noch nicht getestet, aber das programm oben von mir deckt alle diese eingaben ab.
    ich koennte die eingabe nun ueber den getline befehl holen, habe die eingabe dann allerdings als string, ich weiss nun nicht, wie ich diesen string in ein character arrey konvertiere, kannste mir da evtl. helfen?



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    c_str() hilft.

    MFG winexec*



  • und wie ist da die syntax konkret?



  • macinstyle schrieb:

    und wie ist da die syntax konkret?

    std::string s("Hallo");
    const char *p = s.c_str();
    

    Siehe auch:
    http://www.cppreference.com/cppstring/c_str.html

    MfG

    GPC


Anmelden zum Antworten