Strings in Integer und Double Werte ändern

Dieses Thema im Forum "C/C++" wurde erstellt von matthis135, 13.01.2006.

  1. #1 matthis135, 13.01.2006
    matthis135

    matthis135 Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    Hallo,

    ich habe ein Problem:hilfe2: , welches für einige sicher in kurzer Zeit zu lösen ist.
    Ich möchte einen Taschenrechner unter c prog. der nur + und - können soll.
    Eingelesen wird ein max. 80 Zeichen langer String (z.Bsp.: 345+645)
    Diesen String umwandeln ist ja mit atoi auf Grund des + nicht möglich.
    Wie muss ich jetzt rangehen, dass ich als Wert1=345 und als Wert2=645 habe. Das + muss als Operator erkannt werden, also auch einen Wert bekommen.
    Für schnelle Hilfe wäre ich echt sehr dankbar.

    Mit freundlichen Grüßen

    Matthias
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 MrFenix, 13.01.2006
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    Code:
    int i;
    while ( i < strlen(buffer) && buffer[i] != '+')
      i++;
    char * zahlbuffer = (char*)malloc(i * sizeof(char));
    strncpy(zahlbuffer, buffer, i);
    char * zahlbuffer2 = (char*)malloc((strlen(buffer) - i - 1) * sizeof(char));
    strncpy(zahlbuffer2, buffer+i+1, strlen(buffer) - i - 1);
    
     
  4. thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    @MrFenix:
    Müsstest du beim Allozieren des Speichers nicht noch jeweils einen Character für das Stringterminierungszeichen '\0' hinzufügen?
    Beim ersten strncpy() müsste man auch selbst '\0' setzen, weil das strncpy() nicht anfügt/dazukopiert, wenn keins im Bereich von den zu kopierenden Bytes ist.
     
  5. #4 MrFenix, 13.01.2006
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    ich hab eigentlich gelernt, dass man sich um \0 nie selbst kümmern braucht...
    kannst es ja mal ausporbieren, so gehts auf jeden fall.
     
  6. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Waere statt
    nicht
    Code:
    int i;
    while ( i < strlen(buffer) && ( buffer[i] != '+' || buffer[i] != '-'))
      i++;
    
    nicht besser fuer die Aufgabe?
     
  7. #6 MrFenix, 13.01.2006
    MrFenix

    MrFenix Executor

    Dabei seit:
    16.10.2004
    Beiträge:
    480
    Zustimmungen:
    0
    Ort:
    Siegen, NRW
    ja ok ^^
    noch besser wäre aber wahrscheinlich:
    Code:
    char * zahlbuffer1 = strpbrk(buffer, "+-");
    char * zahlbuffer2 = buffer + strlen(zahlbuffer1) + 1;
    
     
  8. #7 Lord Kefir, 13.01.2006
    Zuletzt bearbeitet: 13.01.2006
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Hm, ich würde das irgendwie anders machen:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFFER_SIZE 80
    
    int main (int argc, char *argv[]) {
      int ret = 0, pos1 = 0, pos2;
      char op[BUFFER_SIZE], buffer[BUFFER_SIZE];
    
      fprintf (stdout, "Bitte geben Sie Ihre Berechnung ein: ");
      fgets (op, BUFFER_SIZE, stdin);
    
      for (pos2 = 0; pos2 <= strlen (op); ++pos2) {
        if (op[pos2] == '+' || op[pos2] == '-' || pos2 == strlen (op)) {
          memset (buffer, 0, BUFFER_SIZE);
          for (int i = 0; i < pos2 - pos1; ++i)
            buffer[i] = op[pos1 + i];
          pos1 = pos2;
          ret += atoi (buffer);
        }
      }
    
      fprintf (stdout, "Das Ergebnis lautet %d.\n", ret);
    
      return 0;
    }
    
    Schließlich reicht es alle im C-String vorhandenen Werte inkl. Vorzeichen miteinander zu addieren.

    Mfg, Lord Kefir

    [edit]
    Übrigens kann man mächtig auf die Schnauze fallen, wenn man den Speicher für '\0' nicht alloziert. Aber ist dynamische Speicherverwaltung nicht ein wenig überflüssig für das Beispiel?!
    [/edit]
     
  9. #8 matthis135, 13.01.2006
    matthis135

    matthis135 Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    super,
    vielen dank für die antworten.
    jetzt soll in der rechnung zum bsp.: 34+56-78+my noch mit my gerechnet werden.
    my soll den wert 17 als constante annehmen.
    also deklariere ich my als globale const.
    nur wie erkennt c, wenn ich die zahlen aus dem string einlese dann, das my ein summand ist und die zahl 17 annehmen soll?
    ideen?

    matthias
     
  10. #9 Lord Kefir, 13.01.2006
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Jetzt ralle ich nicht so ganz was du vorhast... mal davon abgesehen: machen wir hier etwa deine Hausaufgaben?!

    Eigentlich musst du doch nur - um bei meinem Beispiel zu bleiben - am Ende des Programms ein ret += my hinzufügen... oder verstehe ich da etwas falsch?!

    Mfg, Lord Kefir
     
  11. #10 matthis135, 15.01.2006
    matthis135

    matthis135 Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    hallo,
    nee, eine hausaufgabe ist es nicht.
    brauche den spaß für die uni, aber ohne bewertung.
    Die gesamt Lösung vom Lord gefällt mir sehr gut,
    nur bekomme ich bei Compilierung unter Linux10 folgenden Hinweis (Fehler):
    Zeile 17: error: for loop initial declaration used outside C99 mode

    Kann mir jemand dazu was sagen?

    Matthias
     
  12. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    In C ist ein Konstrukt wie 'for (int i = 0; i < 5; i++)' nicht erlaubt, die Laufvariable muss bereits vorher deklariert sein:
    Code:
    int i;
    for ( i = 0; i < 5; i++)
    
    Anscheinend ist die im C99 Standard nicht so. In C++ ist es ebenfalls erlaubt, die Laufvariable an der Initialisierung zu deklarieren.

    PS: Bitte nicht 'allozieren', sondern 'allokieren'. Sonst muessten am Ende alle 'loki' der Welt in 'lozi' umgewandelt werden.
     
  13. thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
    Nein, im Deutschen sagt man "allozieren", das k ist nur aus dem englischen Sprachgebrauch übernommen, und wie alle Anglizismen ist es auch gebräuchlich. Kommt im Endeffekt also darauf an was einem besser gefällt, der Fremdwörter-Duden kennt beides. ;-)
    Vgl. auch http://googlebattle.com/index.php?domain=allozieren&domain2=allokieren&submit=Go! oder http://duden.xipolis.net/suche/abstract.php?shortname=felix&artikel_id=4672 und bei Duden manuell nach allokieren suchen (gibt keinen eigenen Eintrag).
     
  14. #13 Lord Kefir, 16.01.2006
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Jep, C99-Standard.

    Mfg, Lord Kefir
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 matthis135, 17.01.2006
    matthis135

    matthis135 Jungspund

    Dabei seit:
    08.11.2005
    Beiträge:
    12
    Zustimmungen:
    0
    Hallo,

    hab jetzt fast alles soweit am Start.
    Wenn ich jedoch den String mit Leerzeichen eingeben (12 + 34)
    stürzt das Programm ab.
    Kann mir da einer helfen?
    Ach Lord, ich hab das mit dem ret+=my am Ende versucht.
    Haut nicht hin, an welche Stelle genau sollte ich das einfügen?
    Danke für die Infos im Voraus.

    Matthias
     
  17. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Oha, dann hat wohl dieses mittelalterliche Kirchenlatein in den Duden Einzug gehalten. Siehe auch http://www.telemachos.hu-berlin.de/materialien/ovidprojekt/einfuehrung/einfuehrung.htm
     
Thema:

Strings in Integer und Double Werte ändern

Die Seite wird geladen...

Strings in Integer und Double Werte ändern - Ähnliche Themen

  1. alles außer letzte 4 strings

    alles außer letzte 4 strings: Hallo, ich habe verschieden lange Strings (Dateinamen) und möchte gerne den Dateinamen als Variable ausgeben: 1. Strings...
  2. Mehere Strings aus unterschiedlichen Zeilen zusammenführen

    Mehere Strings aus unterschiedlichen Zeilen zusammenführen: hi@all, stehe vor einem Problem und habe keine Ahnung wie ich vorgehen kann. Folgende Aufgabenstellung: Ich habe eine große Text Datei und...
  3. Hilfe bei bash - Shellscript gesucht: zusammengehörende Strings in Konfigdatei

    Hilfe bei bash - Shellscript gesucht: zusammengehörende Strings in Konfigdatei: Hallo zusammen, bin leider noch kein Skript-Guru, das folgende Problem wird wohl sehr in die Tiefen von substr, split, regulären Ausdrücken...
  4. Mit sed zwei strings pro zeile ausgeben

    Mit sed zwei strings pro zeile ausgeben: hi@all, hab mal ne frage zu sed: Folgende Zeile: 15.07.2009 09:36:44:129 ? 2 ? ? <-...
  5. Position eines Strings in einem String ermitteln

    Position eines Strings in einem String ermitteln: Hallo Forum, ich ahb ein Problem ich will mir die Position eines Strings in einem String ausgeben lassen. Konkret mein Ausgangsstring ist...