Problem mit einem char*
-
Hi Leute,
ich hab mal eine Funktion geschrieben:
char* CMySQL::MySQLQuery(int clause, char* column, char* from, char* table, char* barrier, char* rows, char* values) { // deklarieren der benötigten Variablen char *sql[9], *query; unsigned int i, size = 0; // Freimachen des Arrays for(i = 0; i < 9; i++) sql[i] = ""; if(clause == 1) { // Speicher reservieren sql[0] = static_cast<char*>(malloc(strlen("SELECT ") + 1)); sql[1] = static_cast<char*>(malloc(strlen(column) + 1)); sql[2] = static_cast<char*>(malloc(strlen(" FROM ") + 1)); sql[3] = static_cast<char*>(malloc(strlen(from) + 1)); sql[4] = static_cast<char*>(malloc(strlen(" WHERE ") + 1)); sql[5] = static_cast<char*>(malloc(strlen(table) + 1)); sql[6] = static_cast<char*>(malloc(strlen(" = '") + 1)); sql[7] = static_cast<char*>(malloc(strlen(barrier) + 1)); sql[8] = static_cast<char*>(malloc(strlen("'") + 1)); // Strings kopieren strcpy(sql[0], "SELECT "); strcpy(sql[1], column); strcpy(sql[2], " FROM "); strcpy(sql[3], from); strcpy(sql[4], " WHERE "); strcpy(sql[5], table); strcpy(sql[6], " = '"); strcpy(sql[7], barrier); strcpy(sql[8], "'"); } else { // Speicher reservieren sql[0] = static_cast<char*>(malloc(strlen("INSERT INTO ") + 1)); sql[1] = static_cast<char*>(malloc(strlen(table) + 1)); sql[2] = static_cast<char*>(malloc(strlen(" (") + 1)); sql[3] = static_cast<char*>(malloc(strlen(rows) + 1)); sql[4] = static_cast<char*>(malloc(strlen(") VALUES (") + 1)); sql[5] = static_cast<char*>(malloc(strlen(values) + 1)); sql[6] = static_cast<char*>(malloc(strlen(")") + 1)); sql[7] = static_cast<char*>(malloc(strlen("") + 1)); sql[8] = static_cast<char*>(malloc(strlen("") + 1)); // Strings kopieren strcpy(sql[0], "INSERT INTO "); strcpy(sql[1], table); strcpy(sql[2], " ("); strcpy(sql[3], rows); strcpy(sql[4], ") VALUES ("); strcpy(sql[5], values); strcpy(sql[6], ")"); strcpy(sql[7], ""); strcpy(sql[8], ""); } // Größe der einzelnen String berechnen for (i = 0; i < 9; i++) size += strlen(sql[i]); // Speicherplatz für den Anfragestring reservieren query = static_cast<char*>(malloc(size + 1)); // alles zusammensetzen for(i = 0; i < 9; i++) strcat(query, sql[i]); return query; }Ich übergebe der Funktion die Werte 1, "pass", "user", "nick", "Apocalypse", NULL, NULL. Wenn man ich den Quellcode durchgehe, würde ich auf folgendes Ergebnis kommen: SELECT pass FROM user WHERE nick = 'Apocalypse'
Die Funktion kommt im großen und ganzen auch darauf, aber vor SELECT stehen noch drei komische Zeichen und somit wird meine SQL-Anfrage falsch. Woran kann das liegen, dass da noch drei Zeichen vorher angehängt werden? Ich danke euch schonmal...
MfG Apocalypse
-
Da malloc nicht initialisierten Speicher zurückliefert, setzt das erste strcat in der Schleife ab dem ersten Nullbyte auf. D.h. es ist purer Zufall, was da noch für Zeichen vorstehen. Eine Lösung könnte sein per strcpy den leeren String nach query zu kopieren (oder einfach das erste Byte auf 0 zu setzen).
Allerdings solltest Du ernsthaft drüber nachdenken, ob Du das überhaupt so lassen willst. Ich würde auf Stringstreams ausweichen. malloc ist auch nicht sehr C++-like. Wer gibt eigentlich den ganzen Speicher im sql-Array wieder frei?
-
a) Warum nicht std::string?
b) Wenn schon char* dann nimm doch sprintf
-
lol C++ Casts und C Speicherallokierung...