Zeichenketten mit dyn Speicher



  • toxor schrieb:

    ok hab den Fehler, die for schleife muss natürlich for die Speicherbereitstellung

    dein Programm hat andere Fehler, vor allem buffer overflows und überschreibst Speicher im Nirvana. Siehe meinen vorigen Post.



  • Habs halt jetzt so gemacht :

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    int main()
    {
    char *array[10];
    char temp[80];
    int i=0;
    
    for(i=0;i<3;i++)
    {
        if( ( array[i] = ( char* )malloc(sizeof( char ) ) ) != NULL )
        {
    
    			printf("Eingabe:");
    
    			fgets(temp,80,stdin);
    			sscanf(temp,"%s",array[i]);
    
        }
    
        else
        {
           // Fehler
        }
    }
    for(i=0;i<3;i++)
    			printf("%s\n",array[i]);
    
    system("pause");
    }
    

    Das passt doch jetzt so, oder ?
    Also zumindest gibt er mir richtige Ausgaben



  • nein, immer noch fehlerhaft, du generierst buffer overflows beim sscanf, weil du nur ein Zeichen reservierst (statt mind. 80).

    Außerdem macht dein fgets(tmp) und danach sscanf keinen Sinn, nimm doch gleich fgets(array[i]). Wie gesagt, siehe meinen ersten Post. Und man castet malloc nicht!



  • Das mit fgets und sscanf hab ich hierher :

    http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_005_001.htm#RxxobKap005001040025E21F04018C

    Das ich malloc caste liegt daran das ich das können muss für ne Prüfung 😞



  • toxor schrieb:

    Das mit fgets und sscanf hab ich hierher :

    http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_005_001.htm#RxxobKap005001040025E21F04018C

    (

    ich empfehle immer, zuerst die ganze Zeile mit fgets einzulesen und dann diese bspweise mit sscanf oder strtok zu parsen. Ja, das ist eine gute Idee, weil man sich nicht mit dem stdin-leeren kümmern muss. Wenn dein sscanf Format allerdings "%s" ist, sprich eine Zeichenkette, brauchst du sie nicht extra zu parsen, weil die gesamte Zeichenkette schon da ist, also brauchst den "Umweg" mit sscanf nicht mehr. Deswegen sagte ich auch, dass hier nicht notwendig ist, sscanf zu benutzen, sonder gleich nur fgets (das hast du nicht falsch gemacht, es war nur unnötig. Das ist was ich sagen wollte)

    toxor schrieb:

    Das ich malloc caste liegt daran das ich das können muss für ne Prüfung 😞

    was hat denn die Prüfung damit zu tun? In C castet man malloc nicht, weil C implizit von void* auf irgendwas* castet. Man sieht in Büchern/Tutrialen/etc gecastete mallocs deswegen, weil jene Autoren (von diesen Büchern/Tutorialen/etc) Idioten sind und C Code mit einem C++ Compiler kompilieren. malloc muss in C++ gecastet werden (wir sind aber im C Forum!) und wenn man schon C++ benutzt, dann sollte man new/delete statt malloc/free benutzen.



  • Ah ok danke für die Erklärung mit fgets().

    Und zu malloc:

    Ich hab da halt ne Aufgabe gefunden inder man eben mit malloc arbeiten muss. Also malloc.h ist bereits als Aufgabenstellung includiert, daher hab ichs halt so verwendet. Oder versteh ich dich falsch und du meinst das ich malloc einfach falsch anwende ?

    p.s: ich schreib Prüfung in C, nicht in C++, deswegen versuche ich natürlich kein c++ synthax zu verwenden ( auch wenn mein compiler damit keine Probleme hätte )



  • toxor schrieb:

    Das ich malloc caste liegt daran das ich das können muss für ne Prüfung

    dann zeig dem prüfer mal das: http://users.powernet.co.uk/eton/c/hackerhotel.html
    🙂



  • toxor schrieb:

    p.s: ich schreib Prüfung in C, nicht in C++, deswegen versuche ich natürlich kein c++ synthax zu verwenden ( auch wenn mein compiler damit keine Probleme hätte )

    Entnehme ich daraus, dass Du auch C-Code mit einem C++-Compiler übersetzt? Wenn ja: Stell den Compiler bitte auf C um (oder benutze den C-Compiler, falls die getrennt sind), denn dann musst Du auch nicht mehr "versuchen darauf zu achten", keine C++-Syntax zu verwenden. Da achtet der Compiler dann schon drauf. Und malloc musst Du dann auch nicht mehr casten.



  • toxor schrieb:

    A
    Ich hab da halt ne Aufgabe gefunden inder man eben mit malloc arbeiten muss. Also malloc.h ist bereits als Aufgabenstellung includiert, daher hab ichs halt so verwendet.

    es ging nur um die Verwendug des malloc.h Headers. Es kann sein, dass vor C98 (weiß ich leider nicht, wo ich nachschauen könnte) üblich war, malloc.h für malloc zu includieren. Ich kenne es eigentlich ab C98 und C99, dass malloc sich in stdlib.h befindet.

    Ich hatte schon mal einmal das Problem, dass ich überall im Code #include <malloc.h> statt #include <stdlib.h> hatte. Unter Windows und Linux ließ sich der Code kompilieren, bei openbsd nicht, weil dieses kein malloc.h hatte. Dann stellte ich fest, dass malloc in stdlib.h definiert ist. Deswegen habe ich gesagt, du solltest malloc.h nicht includieren.

    Oder versteh ich dich falsch und du meinst das ich malloc einfach falsch anwende ?

    malloc darfst du nur mit einer Gebühr von 99 Cents an mich verwenden 😉 😃



  • Hehe alles klar 🙂


Anmelden zum Antworten