Zahlen von String trennen



  • Hi Leute,

    ich muss ein kleines Programm schreiben das wie folgt funktionieren soll:

    Eingabe: calcul + 5.1 6.2

    Ich nehme mal an, dass er mir die beiden Zahlen addieren soll.
    Jedoch müssen diese ja in einer Zeile eingegeben werden, also String.

    Jetzt kenne ich die Funktion atof die mir jetzt die 5.1 "rausholen" kann. Aber wie mache ich das mit der 6.2 ?

    Danke euch fürs Lesen!



  • Die Eingabe an den Leerzeichen aufsplitten, so dass du dann die Strings

    calcul
    +
    5.1
    6.2

    bekommst und damit kannst du dann weiterarbeiten.



  • Hi,
    du meinst einfach, dass die 3 Strings einzeln eingegeben werden sollen?

    #include <stdlib.h>
    #include <stdio.h>
    
    void main (void)
    {
      double zahl1,zahl2;
      char *string1;
      char *string2;
      char *op;
    
    scanf("%s",&op);
    scanf("%s",&string1);
    scanf("%s",&string2);
    
      zahl1 = atof (string1);
      zahl2 = atof (string2);
      printf ("%f", zahl1+zahl2);
    
    }
    

    Wenn ich das so laufen lasse, lässt sich alles eingeben, doch es wird kein Ergebnis ausgegeben, sondern ein Fehler. Mache ich was bei der Adressierung scanf falsch?



  • Du stellst kein Speicher bereit für den String und man benutzt beim Einlesen von Strings kein &. Und nein, ich meinte, dass man die ganze Zeile eingibt und dann im Programm den String an den Leerzeichen auftrennt.



  • Achso, also so wie es da steht ist es ok, nur dass ich keinen Speicher reserviert habe?
    Ich finde in meinem Tutorial nur die direkten Übergaben, also z.b.

    char string1[] = "Hallo Welt\n";

    Aber das Einlesen nicht...



  • Ersetz doch einfach die Pointer-Angaben durch Arrays:

    char string[20];
    sscanf("%20s",string);
    

    (btw, wenn du die Zahlen sowieso von Tastatur einliest, kannst du dir den Umweg über atof() sparen - %lf liest direkt in double-Variablen ein)



  • CStoll schrieb:

    Ersetz doch einfach die Pointer-Angaben durch Arrays:

    char string[20];
    sscanf("%20s",string);
    

    (btw, wenn du die Zahlen sowieso von Tastatur einliest, kannst du dir den Umweg über atof() sparen - %lf liest direkt in double-Variablen ein)

    Ah jetzt verstehe ich was alle mit dem "Speicher bereitstellen" meinen...
    Danke dir für das Beispiel!

    Also ohne den Umweg meinst du das so?

    Weil ich bekomme da falsche Zahlen raus...

    char string1[10];
    char string2[10];
    char op;
    
    scanf("%c",&op);
    scanf("%lf",string1);
    scanf("%lf",string2); 
    
    printf ("%lf",string1[10]+string[10] );
    


  • Nein, ich meinte das ohne die char-Arrays:

    double wert1,wert2;
    char op;
    
    scanf("%c",&op);
    scanf("%lf",&wert1);
    scanf("%lf",&wert2); 
    
    printf ("%f",wert1+wert2);
    

    Erstens solltest du schon dafür sorgen, daß die scanf-Formatkennungen zu den übergebenen Parametern passen (und %lf erwartet ein double*), sonst kommt nur Müll heraus. Zweitens heißt das Ausgabeformat für double-Werte (nur) %f. Und drittens hast du Array-Elemente addiert, die gar nicht mehr dir gehörten (in einem char xx[1]; kannst du die Elemente 0 bis 9 ansprechen, 10 liegt hinter deinem Array).



  • Normal weiß ich, dass "%lf" double erwartet. Aber ich dachte du meintest das so.
    Vor allem hab ich mich blenden lassen, weil ich denke dass die ganze Zeile als string eingelesen werden muss, wegen der Aufgabenstellung.

    Schreibe ein Programm:
    calcul + 5.1 6.2

    Es sollen arithmetische Ausdrücke in den vier Grundrechenarten berechnet werden. Operator und Argumente werden als Kommandozeilenargumente angegeben.
    Zur Umwandlung einer Zeichenkette in einen double Wert kann die Funktion atof() verwendet werden.



  • dprzon schrieb:

    Schreibe ein Programm:
    calcul + 5.1 6.2

    Es sollen arithmetische Ausdrücke in den vier Grundrechenarten berechnet werden. Operator und Argumente werden als Kommandozeilenargumente angegeben.
    Zur Umwandlung einer Zeichenkette in einen double Wert kann die Funktion atof() verwendet werden.

    Dafür benötigst du noch nicht mal scanf() - die einzelnen Argumente werden bereits vom System auf die argv-Elemente verteilt, die mußt du nur noch aufdröseln:

    int main(int argc,char*argv[])
    {
      double val1,val2;
      char op;
    
      if(argc!=3)
      {
        printf("Fehler - bitte Parameter 'calcul + 5.1 6.2' angeben");
        return 1;
      }
    
      op=argv[1][0];
      val1=atof(argv[2]);
      val2=atof(argv[3]);
      ...
    }
    


  • CStoll schrieb:

    dprzon schrieb:

    Schreibe ein Programm:
    calcul + 5.1 6.2

    Es sollen arithmetische Ausdrücke in den vier Grundrechenarten berechnet werden. Operator und Argumente werden als Kommandozeilenargumente angegeben.
    Zur Umwandlung einer Zeichenkette in einen double Wert kann die Funktion atof() verwendet werden.

    Dafür benötigst du noch nicht mal scanf() - die einzelnen Argumente werden bereits vom System auf die argv-Elemente verteilt, die mußt du nur noch aufdröseln:

    int main(int argc,char*argv[])
    {
      double val1,val2;
      char op;
    
      if(argc!=3)
      {
        printf("Fehler - bitte Parameter 'calcul + 5.1 6.2' angeben");
        return 1;
      }
    
      op=argv[1][0];
      val1=atof(argv[2]);
      val2=atof(argv[3]);
      ...
    }
    

    Warum if (argv!=3)...?
    Also welchen Zweck hat es? Wenn man was anderes eingibt als calcul ...?
    Weil vor der if-Abfrage muss doch eine Eingabe abgefragt werden, weil sonst bekomme ich nur die Fehlermeldung.

    Und wie und warum kommt man auf op=argv[1][0] ?

    Nach val2=atof(argv[3]); kommt noch

    {
    .
    .
    .
    printf("%f",val1+val2);
    return 0;
    }
    

    Oder?



  • dprzon schrieb:

    Warum if (argv!=3)...?
    Also welchen Zweck hat es? Wenn man was anderes eingibt als calcul ...?

    argc enthält die Anzahl der übergebenen Parameter - wenn du alles richtig gemacht hast, sollte dort 3 drinstehen (ein Operator und zwei Operanden). In argv stehen dann nacheinander der Programmname (argv[0]) und die weiteren Parameter (in deinem Fall argv[1] der Operator, argv[2] und argv[3] die beiden Operanden).

    Weil vor der if-Abfrage muss doch eine Eingabe abgefragt werden, weil sonst bekomme ich nur die Fehlermeldung.

    Was denn für eine Eingabe? Die Aufgabe verlangt, daß die Werte als Kommandozeilenparameter übernommen werden, da brauchst du keine eigenen Eingaben.

    Und wie und warum kommt man auf op=argv[1][0] ?

    Wie gesagt, in argv[1] steht der erste Parameter, also das "+" - mit argv[1][0] erhältst du das erste Zeichen dieses Strings ('+'), mit dem du weiterarbeiten kannst.

    Nach val2=atof(argv[3]); kommt noch

    {
    .
    .
    .
    printf("%f",val1+val2);
    return 0;
    }
    

    Oder?

    Zum Beispiel. Aber vermutlich solltest du je nach dem Wert von op() entscheiden, welche Grundrechenart du verwenden sollst (wenn dort "calcus -8.0 5.1" eingegeben wird, soll das Programm subtrahieren).



  • CStoll schrieb:

    ...Was denn für eine Eingabe? Die Aufgabe verlangt, daß die Werte als Kommandozeilenparameter übernommen werden, da brauchst du keine eigenen Eingaben.

    Jetzt hab ich verstanden was die Zeilen bedeuten. Ich meine mit der Eingabe, man muss ja das Ergebnis ausgeben lassen, also egal welche 2 Zahlen man eingibt.
    Wenn man das so wie es ist laufen lässt, wird nur der Fehler ausgegeben.



  • dprzon schrieb:

    Jetzt hab ich verstanden was die Zeilen bedeuten. Ich meine mit der Eingabe, man muss ja das Ergebnis ausgeben lassen, also egal welche 2 Zahlen man eingibt.

    Weißt du, was der Unterschied zwischen EINgabe und AUSgabe ist?

    Wenn man das so wie es ist laufen lässt, wird nur der Fehler ausgegeben.

    Dann hast du es vermutlich falsch aufgerufen. Nachdem du das Programm compiliert hast, solltest du mal die Eingabeaufforderung öffnen, per cd C:\Programme\calcus in dein Projektverzeichnis wechseln und dort eingeben:

    calcus + 5.1 8.2
    

    Wenn es dann immer noch mit "Fehler - ..." antwortet, zeig mal bitte den kompletten Programmcode.



  • Bei mir heisst die *.exe Datei 2.3.exe.
    Die ist in dem Debugverzeichnis von dem Projekt (Programm).
    Wenn ich unter der Euingabeaufforderung da rein gehe und z.b. eingebe
    "2.3 + 5 5", dann wird die Fehlermeldung nur ausgegeben.

    Der Code ist ja so:

    #include <stdio.h>
    
    int main(int argc,char*argv[])
    {
      double val1,val2;
      char op;
    
      if(argc!=3)
      {
        printf("Fehler - bitte Parameter 'calcul + 5.1 6.2' angeben");
        return 1;
      }
    
      op=argv[1][0];
      val1=atof(argv[2]);
      val2=atof(argv[3]);
    
      printf("%f",val1+val2);
    
    }
    


  • Nur zu Kontrolle: Setz mal den folgenden Code for den if()-Block:

    int i;
    printf("Args: %d\n",argc);
    for(i=0;i<=argc;++i)
      printf("Arg%d: %s\n",i,argv[i]);
    

    (*grübelt* Es könnte auch sein, daß ich mich irgendwo verheddert habe)

    dprzon schrieb:

    Bei mir heisst die *.exe Datei 2.3.exe.

    Was für ein aussagekräfitger Name 😃 Wo hast du denn den her?



  • Hab den Code jetzt davor gesetzt und eingegeben "2.3 + 5 5".
    Dann kam:

    Args: 4
    Arg0: 2.3
    Arg1: +
    Arg2: 5
    Arg3: 5
    Arg4: <Null>
    Fehlermeldung...
    

    Gehen die Argumente eigentlich nicht von 0...2 (3 Argumente) und nicht 0...3 (4 Argumente) ?

    Auf den Namen 2.3 kam ich, weil das die Aufgabennummer ist, dass ich mit den Ordnern den Überblick behalte. Aber werd das mal trotzdem ändern, leider übernimmt Visual Studio die Programmnamen...



  • Sorry, dann war das wohl mein Fehler - ich hatte nicht bedacht, daß der Programmname auch mitgezählt wird (argv[0] ist der Programmname, argv[1] bis argv[argc-1] sind die Argumente, argv[argc] ist NULL). D.h. die Abfrage sollte if(argc!=4)... heißen.



  • Also ich hab im If Block statt die 3 die 4 genommen. Diesmal wird der Fehler natürlich nicht ausgegeben, aber dafür ein falsches Ergebnis andauernd 7093600.000000.

    Der Datentyp ist ja richtig...
    Im Programm muss man nichts ändern oder?



  • Gbi doch mal zusätzlich den Wert von val1 und val2 aus. (ich kann in deinem Code keinen Fehler entdecken - außer natürlich, du hast ihn per C&P verloren)


Anmelden zum Antworten