Probleme mit ANSI C und Stringzusammenstellung

Mairhofer

Erfahrenes Mitglied
Schönen Guten Morgen,

ich hatte letztens schonmal ein Posting wegen ANSI C von mir gelassen , wo mir sehr sehr sehr gut geholfen wurde.
Nun ich bin mal wieder KO im Sinne vom Verständnis von C.
Folgendes ist mein Problem:

Ich habe Datensätze aus einer MySQL DB gelesen. Mit row[7] und row[8] wird ein neuer Wert berechnet (ergebnis), der dann in Datensatz row[7] geschrieben wird (UPDATE).
Die Berechnung ist ja schonmal nicht mehr das Thema, aber ich muss nun einen String zusammenbasteln, der dann in die MySQL Updated.

Nach Berechnung von "ergebnis" wird über eine Schleife der typ double in String umgewandelt (temp), ich hoffe das geht auch so.

nun wollte ich per strcat oder ähnliches der updatestring (char str[8]) erweitern.
Leider klappt das gar nicht. Ich erhalte immer Speicherzugriffsfehler.
Es soll dann so aussehen:
UPDATE tabellenname SET spaltenname='ergebnis', spaltenname2='stringvariable', spaltenname3='doublewert'
(Als Beispiel)
Ich kompiliere unter Linux Suse 9 mit gcc.
Ich hoffe ich hab mein Problem genau genug geschildert.
Am besten wäre, wenn mir jemand helfen könnte, wie ich an meinen Update string ein Doublewert anhänge, das Zeichen ' und so weiter.

Hier ist nochmal mein Quelltest. Mittlerweile ziemlich zerpflückt und unübersichtlich, sorry
Code:
void testfunktion()
{
   char *str[8], *query;
   double ergebnis;
   char temp[1024];
   char b1[21];
    char b2[23];
   unsigned int  i,j;
   MYSQL_ROW  row;
   MYSQL_RES  *res;
   MYSQL_FIELD  *field;
   int nSize;
   int nPos;

   /* Jetzt die Anfrage an den Datenbankserver */
   mysql_query(mysql, "SELECT * FROM user_bankkonto");
   check_error();
   /* Anfrage vom Server in die Struktur MYSQL_RES laden */
   res = mysql_store_result(mysql);
   check_error();

   /* offset = 0 bedeutet auf den Anfang der Zeile setzen */
   mysql_field_seek (res, 0);

   /* Jetzt die Daten aus der Struktur MYSQL_RES zeilenweise
      einlesen */
   while ((row = mysql_fetch_row (res)) != NULL)
      {
                                  // Berechne den neuen Wert
                                        ergebnis = (atof(row[7])/100) * ((atof(row[8])/7)+100) ;
                                        printf(" ASDASDASD: %lf ", ergebnis);  // Testausgabe
                                        printf("\n");

                                        sprintf(temp, "%lf", ergebnis);
                                                for(j=strlen(temp)-1;j>0;j--)
                                                {
                                                        if(temp[j] != '0' || temp[j] == '.')
                                                        {
                                                                temp[j+1] = '\0';
                                                                break;
                                                        }
                                                }
                                                printf("Result: %s\n", temp); // Testausgabe
                                  // Zusammenstellen des neuen UpdateStrings
                                        str[0] = "UPDATE tabellename SET spaltenname='";
// Ab hier beginnt der Misst
                                        sscanf(str[1], "%1d", temp);
                                        strcat(str[2], str[1]);

      }
   printf("Result: %s\n", str[1]);
   mysql_free_result(res);
}

Vielen Dank,
Andreas
 
Code:
 char *str[8]
Was du hier definierst, ist ein Array von 8 Pointern auf char -- es ist keine Zeichenkette. Wenn du ein Array definieren möchtest, das 7 Zeichen plus Endnull aufnehmen kann, musst du es so machen, wie du es auch in deinem Post ausserhalb des Codes schreibst:
Code:
 char str[8];

strcat() stellt keinen zusätzlichen Speicher zur Verfügung -- es wird also beim Anhängen kein Platz geschaffen für die angehängten Zeichen. Der Platz muss schon vorher da sein. Dementsprechenden solltest du
str grosszügiger dimensionieren.

Und bitte verwende Code-Tags für Sourcen anstelle von Zitat-Tags.
 

Anhänge

  • codetags.gif
    codetags.gif
    7,1 KB · Aufrufe: 82
Hi,

danke für deine Antwort.

Das mit dem char str[8] habe ich von Pronix

ich habe hier mal den Teil eingefügt. Ich habe aber nicht verstanden wie ich das für meine Zwecke umschreiben kann. (Ich bin kein C Versteher ;) )

Diesmal mit dem richtigen Button:

Code:
void filmdaten_aendern()
{
   char change[255],replace[255], temp[4];
   char *item[] = {"titel", "hauptrolle", "fsk", "gedreht" };
   char *ptr;
   char *str[8], *query;
   int auswahl1, auswahl2, i, size=0;
   unsigned int integer;
   unsigned long affected;

   printf("Welche Daten wollen Sie aendern (Suchkriterium)\n");
   printf("[1]=Titel  [2]=Hauptrolle  "
          "[3]=FSK  [4]=Datum  : [ ]\b\b");

   fgets(temp, 3, stdin);
   if( (ptr = (char *) strchr(temp, '\n')) != NULL)
      *ptr = '';  /* newline durch  ersetzen */
   sscanf(temp, "%1d", &auswahl1);

   printf("Welchen Inhalt suchen Sie fuer %s:",item[auswahl1-1]);
   fgets(change, 254, stdin);
   if( (ptr = (char *) strchr(change, '\n')) != NULL)
      *ptr = '';  /* newline durch  ersetzen */

   printf("Welche Daten sollen ersetzt werden"
          " (Ersetzkriterium)\n");
   printf("[1]=Titel  [2]=Hauptrolle  "
          "[3]=FSK  [4]=Datum  : [ ]\b\b");

   fgets(temp, 3, stdin);
   if( (ptr = (char *) strchr(temp, '\n')) != NULL)
      *ptr = '';  /* newline durch  ersetzen */
   sscanf(temp, "%1d", &auswahl2);

   printf("Welchen Inhalt soll %s haben: ",item[auswahl2-1]);
   fgets(replace, 254, stdin);
   if( (ptr = (char *) strchr(replace, '\n')) != NULL)
      *ptr = '';  /* newline durch  ersetzen */

   /* Alle Daten vorhanden, um Querystr zu erzeugen */

   str[0] = "UPDATE filmdaten SET ";
   if(auswahl2 > 0 && auswahl2 < 5)
      {
         str[1] =(char *) malloc(strlen(item[auswahl2-1])+1);
         strcpy(str[1], item[auswahl2-1]);
      }
   else
      {
         printf("Kein solches Kriterium vorhanden!\n\n");
         return;
      }
   str[2] = "=";

   /* Integerwerte ? */
   if(auswahl2==3 || auswahl2==4)
      {
         sscanf(replace, "%d", &integer);
         str[3] =(char *) malloc(5);
         sprintf(str[3], "%4d", integer);
      }
   else /* ... dann ist es ein str */
      {
         str[3] =(char *) malloc(strlen(replace)+3);
         strcpy(str[3], "'");
         strcat(str[3], replace);
         strcat(str[3], "'");
      }
   str[4] = " WHERE ";
   if(auswahl1 > 0 && auswahl1 < 5)
      {
         str[5] =(char *) malloc(strlen(item[auswahl1-1])+1);
         strcpy(str[5], item[auswahl1-1]);
      }
   else
      {
         printf("Kein solches Kriterium vorhanden!\n\n");
         return;
      }
   str[6] = "=";

   /* Integerwerte ? */
   if(auswahl1==3 || auswahl1==4)
      {
         sscanf(change, "%d", &integer);
         str[7] =(char *) malloc(5);
         sprintf(str[7], "%4d", integer);
      }
   else /* ... dann ist es ein str */
      {
         str[7] =(char *) malloc(strlen(change)+3);
         strcpy(str[7], "'");
         strcat(str[7], change);
         strcat(str[7], "'");
      }
   for (i=0; i < 8; i++)
      size+=strlen(str[i]);
   /* Speicherplatz für den Anfragestr reservieren */
   query =(char *) malloc(size + 1);
   strcpy(query, str[0]);
   for(i = 1; i < 8; i++)
      strcat(query, str[i]);

   /* printf("%s",query); */

   /* Jetzt die Anfrage an den Datenbankserver */
   mysql_query(mysql, query);
   check_error();
   if((affected=(unsigned long)mysql_affected_rows(mysql)) <= 0 )
      {
         printf("Kein Datensatz von dieser Anfrage betroffen\n");
         check_error();
      }
   else
      printf("%d %s von dieser Anfrage betroffen\n\n",
                            affected, (affected == 1)?
                 "Datensatz war":"Datensaetze waren");
   free(query);
}

Hier nun nochmal meiner Code:

Code:
void testfunktion()
{
   char *str[8], *query;
   double ergebnis;
   char temp[1024];
   char b1[21];
    char b2[23];
   unsigned int  i,j;
   MYSQL_ROW  row;
   MYSQL_RES  *res;
   MYSQL_FIELD  *field;
   int nSize;
   int nPos;

   /* Jetzt die Anfrage an den Datenbankserver */
   mysql_query(mysql, "SELECT * FROM user_bankkonto");
   check_error();
   /* Anfrage vom Server in die Struktur MYSQL_RES laden */
   res = mysql_store_result(mysql);
   check_error();

   /* offset = 0 bedeutet auf den Anfang der Zeile setzen */
   mysql_field_seek (res, 0);

   /* Jetzt die Daten aus der Struktur MYSQL_RES zeilenweise
      einlesen */
   while ((row = mysql_fetch_row (res)) != NULL)
      {

                                        ergebnis = (atof(row[7])/100) * ((atof(row[8])/7)+100) ;
                                        printf(" ASDASDASD: %lf ", ergebnis);
                                        printf("\n");


                                        str[0] = "UPDATE user_bankkonto SET bank_sparb_stand='";

                                /*      temp[2] =(char *) malloc(strlen(temp[1])+1);
                                        strcat(str[1], asd);
                                        strcpy(asd,"'");
                                        strcat(str[2], asd);

                                        printf("Result: %s\n", temp); */

                                        sprintf(temp, "%lf", ergebnis);
                                                for(j=strlen(temp)-1;j>0;j--)
                                                {
                                                        if(temp[j] != '0' || temp[j] == '.')
                                                        {
                                                                temp[j+1] = '\0';
                                                                break;
                                                        }
                                                }
                                                printf("Result: %s\n", temp); // Testausgabe
                                           // Zusammenstellen des neuen UpdateStrings
                                              str[0] = "UPDATE tabellename SET spaltenname='";
                                           // Ab hier beginnt der Misst
                                                sscanf(str[1], "%1d", temp);
                                                strcat(str[2], str[1]);

}
   printf("Result: %s\n", str[1]);
   mysql_free_result(res);
}

Ich hoffe nun kann man das noch besser verstehen,
Danke
MfG
Andreas
 
char *str[8]

solche sachen solltest du nur dann schreiben, wenn du das Array direkt bei der Deklaration initialisierst, in deinem Fall wäre wohl eine Deklaration wie char str[8 ][255] angebrachter!

// Zusammenstellen des neuen UpdateStrings
str[0] = "UPDATE tabellename SET spaltenname='";
// Ab hier beginnt der Misst
sscanf(str[1], "%1d", temp);
strcat(str[2], str[1]);

das mit dem sscanf ist unnötig ,da temp bereits ein pointer auf char ist, hinzukommt das du fälschlicherweise, 1d anstatt ld in der Formatierung benutzt hast, hier eine möglicheLösung:
strcpy(str[0], "UPDATE tabellename SET spaltenname='");
strcpy(str[1], temp);
strcpy(str[2], str[1]; // hier kein strcat, da str[2] eh noch nicht benutzt wurde, und deshalb nichts enthält, was für dich wichtig ist
 
Hi,
danke für deine Antwort.

Nach ein bischen spielen und testen bin ich nur einen riesigen Schritt weiter

DANKE DANKE DANKE! :D

Andreas
 
Zurück