Addition/Subtraktion in Strings



  • Hallo zusammen,

    ich hänge derzeit an einem Problem, villeicht kann mir jemand weiterhelfen.
    Ich lese eine Textdatei ein, verarbeite und speichere sie wieder ab.

    Jetzt habe ich jedoch folgende Zeile

    M13(Z,30+500-260,X,30+500,Y,10)

    Hier möchte ich die Werte die zwischen '+' und '-' stehen berechnen, so daß die Ausgabe wie folgt wäre:

    M13(Z,270,X,530,Y,10)

    Die Anzahl der Werte kann auch variieren:

    M13(Z,30,X,30+500,Y,10)
    M13(Z,30+500,X,30,Y,10)

    jedoch bleibt es bei Addition und Subtraktion.

    Wie kann ich da am besten vorgehen ?!



  • Wie es am besten geht, weiß ich nicht.

    Ich würde mit einer Schleife durch den String laufen bis ich eine Zahl nach einem ',' finde. Dann mit strtol und den 2. Parameter nutzend die Zahl einlesen und mit dem zweiten Parameter das anfolgend mögliche Rechenzeichen auszuwerten. Wenn ich dabei ein Zeichen finde immer wieder mit strtol auslesen.



  • Ansätze gibts da wie immer mehrere, natürlich unterschiedlich performant, übersichtlich oder verständlich.
    Du schreibst Dir zum Beispiel eine Funktion, die den String in einer Schleife durchläuft und nach den entsprechenden "Kennzeichnern" sucht, wie es Dein Auge auch tut. Prüfe z.B. in einer weiteren Schleife ab, ob das gerade eingelesene Zeichen eine Ziffer oder etwas anderes ist. Wenn Du eine Ziffer hast, lies bis zur nächsten Nicht-Ziffer und merk Dir diese Zahl etc...
    Bedenke, dass Du mit Strings bzw. Char-Arrays direkt keine sinnvollen Rechenoperationen machen kannst. Du musst also die einzelnen Zahlenwerte erst in integer umwandeln oder verwendest dafür entsprechende vorhandene Funktionen.
    Ein paar der wahrscheinlich von Dir dafür verwendeten Funktionen wären:
    Kombination aus fgets und sscanf / nur fscanf
    atoi
    sprintf und fputs / nur fprintf



  • Du kannst die Rechenoperation als Vorzeichen der Zahl betrachten. Dann brauchst du nur die Zahlen addieren.

    Umwandeln kannst die Werte nacheinander mit strtol().
    Über den Parameter **endptr kannst du erkennen ob da ein ',' oder ')' bzw ein '+' oder '-' kommt.

    Oder wenn die Maximalanzahl der Werte bekannt ist (ungetestet):

    int feld[5], anz, i, summe;
    
    anz = sscanf(text,"%d%d%d%d%d", &feld[0], &feld[1], &feld[2], &feld[3], &feld[4]);
    for(i=0,summe=0;i<anz;++i) 
      summe += feld[i];
    

Anmelden zum Antworten