Problem mit malloc und strcpy



  • SeppJ schrieb:

    Daher: Was soll das Programm überhaupt tun?

    Das hab ich mich auch nach dem 3. Durchlesen noch gefragt. Aber ich fürchte das wird für solche wie uns auf ewig verschlossen bleiben.

    Ist wohl eher so was wie ne Voodoogeschichte wo der Normalsterbliche sowieso nicht so ohne Weiteres durchblickt.



  • Besonders pädagogisch wertvoll ist ja, dass der (eine einzige klitzekleine!) Fehler jetzt weg ist. Das Problem hat sich quasi erledigt und das Programm ist wunderbar kompilierbar - alles nur durch Entfernen aller Codezeilen! Wie praktisch.

    Selbst, wenn Du - lieber Threadverbrecher - einen der Drölftausend Fehler behoben haben solltest, hast Du Dich der Codevergewaltigung strafbar gemacht.
    Abgesehen davon wäre es für jemanden, der diesen Thread durch die Suche findet und sein persönliches malloc und strcpy Problem lösen zu können hofft sehr hilfreich, wenn Du Deine Lösung noch kurz präsentierst. Bei der Gelegenheit solltest Du aber bitte nochmal jemanden mit Programmierkenntnisse über den Code schauen lassen...



  • Das Gesammt Programm aufgrund eines Ausschnittes zu verstehen ist natürlich nicht Möglich.

    Aber natürlich hast du h0rst recht das für andere es nett wäre die Lösung zu schreiben. Mein Problem war nur die falsche Konvertierung vom void zeiger auf einen char zeiger. Die Konvertierung mit

    str[1] = (char) malloc(strlen(nombre)+1);
    

    Funktioniert natürlich nicht da ich nicht einen Zeiger in ein char zeichen Umwandeln kann. Mit dieser Zeile Funktioniert es:

    str[1] = (char *) malloc(strlen(nombre)+1);
    

    Der Stern hat nur gefällt.
    Die Fehlerausgabe beruht aber auf dem Fehlen überhaupt einer Konvertierung. Bei einer Konsolenanwendung war die Konvertierung nicht nötig, bei einer Win32-Anwendung scheint sie es aber zu sein.

    Dann was gibt es großartig an diesem Programm auszusetzen? Wenn es es Vorschläge für verbesserungen gibt würde ich mich über einen Freundlichen Hinweis freuen.

    Für die Neugierigen:
    Dieses Programm dient zum Verwalten einer Mysql Datenbank, dieser Auschnitt hat den zweck Dynamisch einen String zu erstellen mit den Eingegebenen Daten und diesen String an den Mysql-Server zu schicken.



  • Da haben sich die befürchtungen der anderen bewarheitet.

    str[] ist ein Array von char . Das heißt, das jedes Element des Arrays ein char aufnehmen kann.
    Du weist diesem Element jedoch einen Zeiger zu.

    Das casting vor malloc ist bei C (im Gegensatz zu C++) nicht nötig.
    Du compilierts dein Programm als C++ Programm. Das kann man durch Compilerswitche /Projekteinstellungen ändern.

    Wenn etwas gefehlt hat, ist es der * vor str:

    char *str[7];
    

    Dann ergibt es etwas Sinn.



  • zwerg91 schrieb:

    Wenn es es Vorschläge für verbesserungen gibt würde ich mich über einen Freundlichen Hinweis freuen.

    "freundlichen ist ein Wiewort, "Verbesserungen" ein Namenwort. 🤡



  • mezzo mix schrieb:

    zwerg91 schrieb:

    Wenn es es Vorschläge für verbesserungen gibt würde ich mich über einen Freundlichen Hinweis freuen.

    "freundlichen ist ein Wiewort, "Verbesserungen" ein Namenwort. 🤡

    Die Großen (Namenwort!) sagen dazu auch Adjektiv und Substantiv...
    Die Mittelgroßen womöglich Eigenschaftswort und Hauptwort...

    Und: Ja, Du hast Recht! Auch ich habe im Kindergarten die Begriffe Wiewort oder Namenwort gehört, wahrscheinlich aber zeitnah mit den lateinischen Pendants substituiert ;-P :xmas2:



  • zwerg91 schrieb:

    Der Stern hat nur gefällt.

    Was wurde vom Stern gefällt, so daß er keine Zeit hatte die Zeiger zu deklarieren und daher fehlte?

    zwerg91 schrieb:

    Dann was gibt es großartig an diesem Programm auszusetzen? Wenn es es Vorschläge für verbesserungen gibt würde ich mich über einen Freundlichen Hinweis freuen.

    1. Problem:
    Dein Array str hat 7 Elemente:

    char str[7], *query, *ptr;
    

    Später tust Du aber so, als ob er 9 hätte:

    for (int i=0; i < 9; i++) size+=strlen(str[i]);
    

    2. Problem:
    Bin mir jetzt nicht sicher ob MySQL mit Bindvariablen umgehen kann, aber Dein Programm ist jedenfalls anfällig für SQL-Injection. Schau mal, was Du zum Thema SQL-Injection findest und wie man dem mit MySQL begegnen kann. In z.B. Postgres oder Oracle würde ich Bindvariablen benutzen:

    sql_execute( 
       "INSERT INTO filmdaten "
       "(Nombre, Appelido_Paterno, Appelido_Materno)"
       "VALUES"
       "(:Nombre, :Appelido_Paterno, :Appelido_Materno)",
       nombre, paterno, materno );
    

    3. Problem:
    Deine ganzen String-Manipulationen sind genau DER Grund für die Schaffung einer String-Klasse. Schau Dir also mal die Dokumentation zu std:string an.

    mfg Martin


  • Mod

    mgaeckler schrieb:

    3. Problem:
    Deine ganzen String-Manipulationen sind genau DER Grund für die Schaffung einer String-Klasse. Schau Dir also mal die Dokumentation zu std:string an.

    Nun, er macht C, da wird ihm etwas aus C++ nicht viel nützen.



  • Ganz ohne malloc gehts auch:

    char query[10000];
    
    sprintf(query,"INSERT INTO filmdaten (Nombre, Appelido_Paterno, Appelido_Materno) VALUES ('%s','%s','%s');",nombre,paterno,materno);
    
    mysql_real_query(my, query, strlen(query));
    


  • Doofschlumpf schrieb:

    mezzo mix schrieb:

    zwerg91 schrieb:

    Wenn es es Vorschläge für verbesserungen gibt würde ich mich über einen Freundlichen Hinweis freuen.

    "freundlichen ist ein Wiewort, "Verbesserungen" ein Namenwort. 🤡

    Die Großen (Namenwort!) sagen dazu auch Adjektiv und Substantiv...

    Ach, wir haben ersteres immer namenwortisiertes Wiewort genannt.


Anmelden zum Antworten