sscanf Leerzeichen



  • Tag Zusammen
    Bei sscanf() wir ja bei einem String immer nur bis zum Leerzeichen eingelesen.
    Nun hätte ich gerne, das er es komplett einliest.
    Beispiel

    char eingabe[1024] = "Hallo wie geht es?"
    char ausgabe[1024];
    sscanf(eingabe,"%s",ausgabe);
    cin << ausgabe;
    

    Da wird dann nur dass ausgegeben.

    Hallo
    

    Ich hätte es aber gerne so:
    Beispiel

    char eingabe[1024] = "Hallo wie geht es?"
    char ausgabe[1024];
    sscanf(eingabe,"%?",ausgabe); // ? ich weiß nicht was hier rein muss, damit die Leerzeichen mitgelesen werden
    cin << ausgabe;
    

    Dann soll das ausgegeben werden.

    Hallo wie geht es?
    

    Oder geht das nur mit boost?

    Schonmal Danke.



  • Keiner eine Ahnung?



  • printf( eingabe)
    

    Oder hast Du Dein Problem vielleicht etwas "unglücklich" formuliert ? 😃



  • Scheppertreiber schrieb:

    Oder hast Du Dein Problem vielleicht etwas "unglücklich" formuliert ? 😃

    😃
    Vermutlich hast du damit recht. Vielleicht verdeutlicht es das besser:

    char eingabe[1024] = "Hallo wie geht es?"
    char ausgabe[1024];
    sscanf(eingabe,"Hallo %s es",ausgabe);
    cin << ausgabe;
    

    Ausgabe:

    wie
    

    Ich hzätte gerne das ich das als Ausgabe kriege:

    wie geht
    

    MfG Tim



  • Für diese Aufgabe würde ich dir einen Scanner empfehlen. Die können einen komplexen String in seine Bestandteile (Tokens) zerlegen.

    Unter (http://dinosaur.compilertools.net/flex/index.html#SEC19) findest du den Scanner flex. Flex generiert aus einem Skript C Code, welche einen x-beliebigen String in seine Tokens zerlegt. Dafür musst du dich aber ein wenig in die Materie (Reguläre Ausrücke, flex Bedienung, ein wenig Compilerbau) einarbeiten.

    Willst du dann Beispielsweise alle Zeichen zwischen "Hallo" und "es" einlesen muss man im Flex Skript folgendes angeben:

    %StringToken%:="Hallo "[A-Z ]+"es"
    

    Vorsicht! Da ich schon lange mehr kein Skript generiert habe können die Variablendeklaration und -zuweisung ein wenig anders sein. Im Prinzip funktioniert aber die Zuweisung so.



  • Ich denke mal, in dem Moment wo er sein Problem klar formuliert
    weiß er was er eigentlich will und wir auch. DANN kann man helfen.
    (eigentlich hat er dann auch die Lösung).



  • Scheppertreiber schrieb:

    Ich denke mal, in dem Moment wo er sein Problem klar formuliert
    weiß er was er eigentlich will und wir auch. DANN kann man helfen.
    (eigentlich hat er dann auch die Lösung).

    Ok da ich es wohl immer noch nicht richtig verdeutlicht habe, was ich eigendlich will, hier nocheimal der Versuch :D:

    Nehmen wir an ich habe diesen String: "<>Hallo hier bin ich<>" und ich will aus diesem String alles zwischen <> <> haben. Also ich hätte gerne dann nur noch das "Hallo hier bin ich" in einem String.
    Wenn ich das nun aber mit sscanf() versuche krieg ich immer nur das "Hallo" in den neuen String:
    Beispiel:

    char eingabe[1024] = "<>Hallo hier bin ich<>?"
    char ausgabe[1024];
    sscanf(eingabe,"<> %s <>",ausgabe);
    cout << ausgabe;
    

    Dann krieg ich da als Ausgabe nicht wie gewünscht das "Hallo hier bin ich" sondern nur das "Hallo", weil ssacnf wohl immer bei einem Whitespace(Leerzeichen) aufhört weiter einzulesen.

    Ich hoffe ich habe mein Problem damit jetzt verdeutlicht....
    MfG Tim



  • Ok. Nehmen wir mal Dein letztes Beispiel. Du willst den String der durch zwei Strings "<>"
    eingegrenzt wird. Trivial wäre natürlich, das mit memcpy rauszukopieren halt abzählen).

    Sollte der String noch in etwas anderes eingebetet sein, würde ich so vorgehen:

    char eingabe[1024] = "<>Hallo hier bin ich<>?"
    char ausgabe[1024];
    char *p;
    
    // Suche das erste <>
    if ( (p = strstr( eingabe, "<>")) == 0){
      // das ist ein Fehler, der erste fehlt, Abbrechen.
    }
    
    // Von der ersten Fundstelle+2 das nächste suchen
    if ( (q = strstr( p+2, "<>")) == 0){
      // das ist auch ein Fehler, der letzte fehlt, Abbrechen.
    }
    
    // Der Rest steht dazwischen. *q auf 0 setzen um den String zu terminieren
    *q = 0;
    // p+2 um das <> zu überlesen
    strcpy( ausgabe, p+2);
    

    Kann man auch anders lösen. Klar. Bestimmt hat ein Freak aus sowas mal ein
    "Projekt" mit einer eigenen "Klasse" gemacht ... 😃



  • Ok ich hatte halt gehofft, dass es da eine Funktion oder sowas gibt...
    Dann muss ich es halt so machen

    Danke



  • Klar gibt's 'ne Funktion: selbst schreiben 👍



  • Wozu mit C++ scanf() nutzen ?!?

    std::cin.getline()


Anmelden zum Antworten