kostenloser Webspace werbefrei: lima-city


[C] Problem mit Strings

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    Hi ihr Limaner,

    Ich habe mich zum ersten Mal seit etwa einem Jahr wieder an ein C-Programm rangetraut.
    Das Ziel ist es, eine Gleichung einzugeben und das Projekt rechnet dir den Wert von X aus.
    z.b:
    3x²+20x-34=54x+77
    Dann rechnet das Programm und gibt
    x1=0 und x2=-7
    aus. (vollkommen willkürliche Zahlen, ich hab nicht nachgerechnet.)

    Bisher ging es ganz gut, doch habe ich plötzlich einen Segmentation Fault. Ich zeige euch den Code mal.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <Mathj.h> //eigene Bibliothek, definiert expo(double, int);
    
    int args_leq; //number of arguments on left side of equation
    int args_req; //same for right side
    
    int i; //just a variable
    
    char argument[100]; //self-explanatory in later context. Same for next 2
    char args_leq_ar[100];
    char args_req_ar[100];
    char leq[9999] = {0}; //needed much later, when trying to copy all of the left side of equation into one string
    char req[9999] = {0}; //same for right side
    
    
    float p; //the variable "p" as you can find in the pq-formula
    float q; //the variable "q"
    
    float x1; //result for one possibility of the identity of x
    float x2; //result for the other
    
    int main(int argc, char *argv[])
    {
      
      printf("How many arguments does the left side of the equation have? ");
      scanf("%d",&args_leq);
      
      for(i=1;i<=args_leq;i++)
      {
      printf("\nType in argument number %d: ", i);
      scanf("%s",&argument); //stores the i. argument in variable argument
      
      args_leq_ar[i]=argument; //sets args_leq_ar[i] as the same as in argument
    
    //out-commented lines, which will replace the current workaround
      /*size_t required_length = strlen(args_leq_ar[i-1]) + strlen(leq[0]) + 1;
      leq[0] = malloc( required_length );
      strcpy(leq[0],args_leq_ar[i-1]);
      free( array[0] );*/
      }
      
      printf("\nIs this the left side of your equation: %s", args_leq_ar[1]); //next 2 lines build the equation, this is a workaround
      printf("%s", args_leq_ar[2]);
      printf("%s ?", args_leq_ar[3]);
      system("PAUSE");	
      return 0;
      
      //outcommented part of code, needed much later, but already functional
      /*printf("Type in p: ");
      scanf("%f",&p);
      printf("\nNow type in q: ");
      scanf("%f",&q);
      x1=(-p/2)+sqrt(expo(p/2,2)-q);
      x2=(-p/2)-sqrt(expo(p/2,2)-q);
      printf("X1 has the value: %.3f\n X2 has the value: %.3f\n", x1, x2);
      system("PAUSE");
      return 0;*/
    }


    Das Programm schmiert hier ab:
    printf("\nIs this the left side of your equation: %s", args_leq_ar[1]); //next 2 lines build the equation, this is a workaround
      printf("%s", args_leq_ar[2]);


    Bis dahin funktioniert es.

    Und jetzt eine Bitte: Ich bin kein Profi, das bisschen was ich kann hab ich mir selbst beigebracht. Bitte ignoriert Schönheits- und Performance-Fehler wenn ihr mir verbesserte Versionen zeigt, versucht in einem ähnlichen Stil zu schreiben, wenn möglich, da ich sonst nicht checke was ihr macht^^

    Liebe Grüße,

    InfinitySounds
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo infinitysounds,

    dein Problem liegt in der Kombination aus %s und args_leg_ar[1]. args_leg_ar[1] gibt dir den 2. Character aus dem Array zurueck und %s erwartet eine Adresse an der ein String beginnt. Der Character wird jetzt also als Adresse interpretiert und das fuehrt zu einem Segmentation Fault.

    Den Fehler machst du eigentlich schon in der Zeile
    args_leq_ar[i]=argument;
    , wo du einen String (also einen char-Pointer) in einen char schreiben willst, zumal du zum Kopieren des Strings auch eine Funktion wie strncpy verwenden musst, weil du durch eine einfache Zuweisung lediglich den Pointer auf den String sicherst und somit, weil argument in jeder Iteration der for-Schleife geaendert wird, du nur den letzten String speichern wuerdest.

    Kannst es ja mit diesen Tipps erstmal nochmal selber probieren und sonst meldeste dich nochmal hier ;)

    Gruss,
    madhouse
  4. Dein Problem ist die Stringausgabe mit %s, du gibst hier nur ein Zeichen aus.
    Du musst statt dem Code:
    printf("%s", args_leq_ar[2]);

    diesen Code schreiben:
    printf("%s", args_leq_ar);
  5. Autor dieses Themas

    infinitysounds

    Kostenloser Webspace von infinitysounds

    infinitysounds hat kostenlosen Webspace.

    Ich habe es jetzt endlich geschafft, die Lösung war das Verwenden eines Multidimensionalen Arrays:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <Mathj.h> //eigene Bibliothek, definiert expo(double, int);
    
    int args_leq; //number of arguments on left side of equation
    int args_req; //same for right side
    
    int i; //just a variable
    
    char argument[100]; //self-explanatory in later context. Same for next 2
    char* args_leq_ar[100][100];
    char* args_req_ar[100][100];
    char leq[9999] = {0}; //needed much later, when trying to copy all of the left side of equation into one string
    char req[9999] = {0}; //same for right side
    
    
    float p; //the variable "p" as you can find in the pq-formula
    float q; //the variable "q"
    
    float x1; //result for one possibility of the identity of x
    float x2; //result for the other
    
    int main(int argc, char *argv[])
    {
      
      printf("How many arguments does the left side of the equation have? ");
      scanf("%d",&args_leq);
      
      for(i=1;i<=args_leq;i++)
      {
      printf("\nType in argument number %d: ", i);
      scanf("%s",&argument); //stores the i. argument in variable argument
      
      strncpy(args_leq_ar[i], argument, sizeof(args_leq_ar[i]));
      //args_leq_ar[i]=argument; //sets args_leq_ar[i] as the same as in argument
    
    //out-commented lines, which will replace the current workaround
      /*size_t required_length = strlen(args_leq_ar[i-1]) + strlen(leq[0]) + 1;
      leq[0] = malloc( required_length );
      strcpy(leq[0],args_leq_ar[i-1]);
      free( array[0] );*/
      }
      
      printf("\nIs this the left side of your equation: %s", args_leq_ar); //next 2 lines build the equation, this is a workaround
      printf("%s", args_leq_ar[1]);
      printf("%s ?", args_leq_ar[2]);
      system("PAUSE");	
      return 0;
      
      //outcommented part of code, needed much later, but already functional
      /*printf("Type in p: ");
      scanf("%f",&p);
      printf("\nNow type in q: ");
      scanf("%f",&q);
      x1=(-p/2)+sqrt(expo(p/2,2)-q);
      x2=(-p/2)-sqrt(expo(p/2,2)-q);
      printf("X1 has the value: %.3f\n X2 has the value: %.3f\n", x1, x2);
      system("PAUSE");
      return 0;*/
    }


    Danke für eure Tipps :D
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!