1

C++ Eingabe Zeichenkette und Zahl in einem

Frage von Inv151673 Inv151673

Moin moin,

ich möchte eine Zeichenkette und eine Zahl gleichzeitig vom Benutzer eingeben lassen. Das ganze soll eine Simulation werden. Ich gebe z.B. "speed 450" ein und dann soll die Geschwindigkeit auf 450 gestellt werden.

Ansich hab ich mir gedacht ich les das ganze als string oder char ein suche erst nach dem Befehl z.B. "speed", entferne dann den Befehl und das darauf folgende Lerrzeichen und wandle den Rest, es bleibt ja nur noch die Zahl, mittels atoi() in einen Integer um.

Bis auf das Umwandeln hat ales einwandfrei funktioniert, der Integer hat halt am Ende den Wert 0. Wie kann das sein eigentlich sollte das doch funktionieren?

MfG Inv151673 ;)

Fragen zu gleichen Themen finden

Antworten (4)

  • 0
    Antwort von Mickeyman Mickeyman

    Am einfachsten wäre das Einlesen, wenn du aus der guten alten C-Bibliothek die Methode sscanf verwendest. :) http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

    Hier habe ich mal ein Beispiel dafür gemacht:

    std::string test = "speed 500";
    int number = 0;
    char command[50];
    
    int countResults = sscanf(test.c_str(), "%s %i", &command, &number);
    
    if(countResults == 2)
    {
        std::cout << "Erfolgreich eingelesen!" << std::endl;
        std::cout << "Befehl: " << command << std::endl;
        std::cout << "Zahl: " << number << std::endl;
    }
    else
    {
        std::cout << "Fehler beim Einlesen des Textes." << std::endl;
    }
    

    Ich habe da jetzt aus Faulheit ein wenig an Kommentaren gespart, hoffe aber, dass du das mit dem Link verstehen wirst.

    Bei deinem Fehler mit atoi könnte es daran liegen, dass du vorher versuchst, am Anfang der Zeichenkette, Zeichen zu entfernen. Denn was für Zeichen willst du statt dessen an diese Stelle packen? Denn Löschen kann man nicht so einfach, sondern nur ersetzen. Daher müsstest du den Textteil mit der Zahl an den Anfang des Strings kopieren und dann das mit dem Zeichen '\0' direkt dahinter setzen.

  • 0
    Antwort von truewolfs truewolfs

    versuch mal anstelle von itoa

    Zahl = Int32.Parse( sString, NumberStyles.Number );

    mit der syntax geht es vielleicht. kann nicht versprechen

    auch

    ToInt32();

    könnte klappen

    vielleicht geht es ja dann.

    Kommentar von Inv151673 Inv151673Inv151673

    was meinst du mit NumberStyles?

    Kommentar von truewolfs truewolfstruewolfs

    None | The integral-digits element only.

    AllowDecimalPoint | The decimal point (.) and fractional-digits elements.

    AllowExponent | The "e" or "E" character, which indicates exponential notation. This flag by itself supports values in the form digitsEdigits; additional flags are needed to successfully parse strings with such elements as positive or negative signs and decimal point symbols.

    AllowLeadingWhite | The ws element at the beginning of s.

    AllowTrailingWhite | The ws element at the end of s.

    AllowLeadingSign | The sign element at the beginning of s.

    AllowTrailingSign | The sign element at the end of s.

    AllowParentheses | The sign element in the form of parentheses enclosing the numeric value.

    AllowThousands | The thousands separator (,) element.

    AllowCurrencySymbol | The currency ($) element.

    Currency | All elements. However, s cannot represent a hexadecimal number or a number in exponential notation.

    Float | The ws element at the beginning or end of s, sign at the beginning of s, and the decimal point (.) symbol. The s parameter can also use exponential notation.

    Number | The ws, sign, thousands separator (,) and decimal point (.) elements.

    Any | All elements. However, s cannot represent a hexadecimal number.

    das ist die liste der numbersyles. du brauchst none weil es integer sind.

  • 0
    Antwort von lablab66 lablab66

    Ich hätte es so gemacht.

    Der String "speed 450" muss zwischen den Leerzeilen getrennt werden. (Tokenizer) Dann wird der getrennte String in ein mehrzeiliges Eingabefeld gespeichert, dort werden die Zeilen gezählt. Falls in der ersten Zeile das Wort: "speed" steht, muss der Integer, der in der 2. Zeile steht, die Geschwindigkeit angeben.

    Kommentar von Inv151673 Inv151673Inv151673

    Das klingt doch schon mal nach mehr Ahnung als ich sie habe ;) Ich werde mich da nachher mal schlau machen und gucken was dabei rauskommt, allerdings stellt sich mir eine Frage:

    Wenn du schon im Stande bist die Variable so zu trennen das "speed" als String und 450 als Integer zurückbleiben, warum willst du das ganze dann noch in einem Eingabefeld zwischenspeichern anstatt direkt in eine Variable? Bzw warum es nicht direkt nutzen?

    Kommentar von lablab66 lablab66lablab66

    Könnte man auch tun, es ist jedoch Angewohnheitssache, wie man das tut.

  • 0
    Antwort von Enders9 Enders9

    Haben Sie sich mal angeschaut was in dem Char oder String drinnen steht, nachdem Sie den Befehl entfernt haben? Es sieht nämlich so aus, als wäre die Zahl Ziffernweise in eine Variable geschrieben worden, wobei immer die letzte Ziffer durch die neue ersetzt wurde.

    Ansonsten kann man ohne Code nicht wirklich helfen.

    Kommentar von Inv151673 Inv151673Inv151673

    Ja, wenn der Befehl ausfindig gemacht und gelöscht wurde ist nur noch die Zahl in Form eines Strings in der Variable.

    So ungefähr hatte ich das gemacht:

    char befehl[255]; // "speed 240"

    char* temp = strstr(befehl, "speed"); strcpy(temp, "", 6); // 6 weil die Leerzeile mitbedacht werden muss

    // Zu diesem Zeitpunkt enhält die Variable nur noch den // String "240" genauso wie ich es wollte

    int ZahlAusString = atoi(befehl); // Diese Variable enthält 0!!

    Kommentar von Enders9 Enders9Enders9

    Wenn Sie das hier nehmen sollte es funktionieren: strncpy(temp, "000000", 6);

    Sie übergeben dem Compiler einen einzigen Charakter, sagen ihm aber er soll 6 Zeichen damit füllen. Was Sie ersetzen muß so lang sein wie was ersetzt wird.

Diese Frage

Verwandte Fragen

Noch nicht den richtigen Rat gefunden?

Einfach und schnell viele hilfreiche Ratschläge von Deutschlands aktivster Ratgeber-Community erhalten!

Einfach und schnell einen Tipp erstellen und Ihren guten Rat mit anderen teilen!

Einfach und schnell ein Video hochladen und anschaulichen Rat an alle geben!

Die unter gutefrage.net angebotenen Dienste und Ratgeber Inhalte werden nicht geprüft. Die Richtigkeit der Inhalte wird nicht gewährleistet. Rechtliche Hinweise finden Sie hier.