Strings in Integer und Double Werte ändern

M

matthis135

Jungspund
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
 
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);
 
@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.
 
ich hab eigentlich gelernt, dass man sich um \0 nie selbst kümmern braucht...
kannst es ja mal ausporbieren, so gehts auf jeden fall.
 
Waere statt
MrFenix schrieb:
Code:
int i;
while ( i < strlen(buffer) && buffer[i] != '+')
  i++;
nicht
Code:
int i;
while ( i < strlen(buffer) && ( buffer[i] != '+' || buffer[i] != '-'))
  i++;
nicht besser fuer die Aufgabe?
 
ja ok ^^
noch besser wäre aber wahrscheinlich:
Code:
char * zahlbuffer1 = strpbrk(buffer, "+-");
char * zahlbuffer2 = buffer + strlen(zahlbuffer1) + 1;
 
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]
 
Zuletzt bearbeitet:
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
 
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
 
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
 
matthis135 schrieb:
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
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.
 
rikola schrieb:
PS: Bitte nicht 'allozieren', sondern 'allokieren'. Sonst muessten am Ende alle 'loki' der Welt in 'lozi' umgewandelt werden.
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).
 
rikola schrieb:
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.

Jep, C99-Standard.

Mfg, Lord Kefir
 
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
 
thorus schrieb:
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).
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
 
matthis135 schrieb:
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

Hm... könntest Du mal Deinen Quelltext posten? Sonst weiß ich leider nicht so wirklich, wie ich da helfen könnte :)

Wegen der Leerzeichen: das simpelste wäre vermutlich, alle Leerzeichen zu löschen. Einfach mit einer for-Schleife den String durchlaufen und das Zeichen mit der Funktion isspace() überprüfen (ist in ctype.h deklariert). Quellcode liefere ich jetzt nicht, weil ich jetzt ins Bett gehe *gähn* War ein anstrengender Tag heute... ;)

Mfg, Lord Kefir
 
Zurück
Oben