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...


Anmelden zum Antworten