Problem mit Stringtabellen und calloc



  • Hallo,

    arbeite mich gerade in C ein wenig ein und spiele mich mit Verzeichnissen gerade herum. Ich versuche dabei die Dateien in einem bestimmten Verzeichnis auszulesen, und diese in eine Stringtabelle zu schreiben. Leider funktioniert das nicht ganz so wie ich mir das vorstelle. In der Stringtabelle wird anscheinend immer alles überschrieben oder so. Zum besseren Verständnis:

    #include <dir.h>
    #include <dirent.h>
    #include <windows.h>
    #include <stdio.h>
    
    char *file[10];
    
    void main()
    {
        const char *path1 = "C:\\test\\";
        WIN32_FIND_DATA dir;
        HANDLE fhandle;
        char directory[256];
        char *files[10];
        int i = 0;
        int j = 0;
        sprintf(directory,"%s\\*.*",path1);
    
        if ((fhandle=FindFirstFile(directory,&dir)) != INVALID_HANDLE_VALUE)
        {
          do
          {
            if(strlen(dir.cFileName) > 2)
            {
              printf("%s\n", dir.cFileName);
              file[i[u][/u]] = (char*)calloc(255, sizeof(char));
              file[i[u][/u]] = dir.cFileName;
              printf("%s\n", file[i]);
              i++;
            }
    
          }
          while(FindNextFile(fhandle,&dir));
    
        }
        FindClose(fhandle);
    
        while(j != i)
        {
          printf("%s\n", file[j]);
          j++;
        }
    
    }
    

    Ausgabe ist dann wie folgt:

    test1.txt
    test1.txt
    test2.txt
    test2.txt
    test3.txt
    test3.txt
    test3.txt
    test3.txt
    test3.txt

    anscheinend schreibt die Zeile
    file[i] = dir.cFileName;
    über einen jeden Stringeintrag der zuvor gemacht wurde drüber.

    Da ich mit meinem Latein am Ende bin und nach stundemlangen herumsuchen keine Lösung gefunden habe, hoffe ich auf Eure Hilfe.

    Besten Dank im voraus,

    jopperl

    Edit by c.rackwitz: BBCode aktivieren bitte. die cpp-Tags sind trotzdem irgenwie kaputt, hab mal code-Tags eingesetzt.



  • char *foo = malloc(1000);
    foo = "hallo welt"; // falsch!!!
    strcpy(foo, "hallo welt"); // richtig :)
    

    und jetzt sag mir mal, was ein pointer ist.

    edit: ich will cpp-tags sehen.



  • verdammt, diese Pointer.

    Hatte bis jetzt mehr mit Java zu tun und da gibt es diese Dinger nicht.

    es funktioniert aber, danke.

    Ich werde mir das ganzen nochmals anschauen und versuchen zu verstehen und den Fehler, den ich gemacht habe den posten.

    besten Dank!!



  • also, ich glaub ich hab es kappiert.

    ich habe dem pointer *file immer die adresse von dem letzten eingelesenen file namen (dir.cFileName) übergeben. dadurch zeigte der pointer auf die adresse des gerade eingelesenen filenames.
    das darauffolgende printf hat dann natürlich den richtigen filenamen ausgeworfen, da bei diesem Schleifendurchlauf der richtige Filename auf dieser Adresse stand. mit dem nächsten durchlauf wurde dann auf die Adresse dir.cFileName der nächste filename eingelesen. und so weiter.

    und in der while schleife wird dann mit jedem element file[0] file[1] file[2] auf die adresse von dir.cFileName verwiesen und dort steht noch der filename des zuletzt eingelesenen files.

    ist das so richtig?

    und so sorry für die falschen tags, zuerst funktionierten sie richtig, dann wollte ich statt den code-tags c/c++-tags verwenden dies hat aber nicht funktioniert. habe mir auch extra die vorschau angesehen. werde ab sofort "nie" wieder posten ohne code- oder c/c++-tags. das howto musste da anscheinend sofort abgedatet werden.

    besten dank für die rasche antwort



  • deine erklaerung ist prima. ich denke, dass du es verstanden hast.

    was die cpp-Tags angeht, brauchst du dich nicht zu sorgen. die machen gerne mal mucken (scheint mit [i] als index zusammenzuhaengen...) code-Tags sind auch nicht besser. die gehen zwar nicht so einfach kaputt, verschlucken aber ein [b] zum beispiel konsequent.

    auf den ersten blick habe ich nur das fehlende highlighting gesehen und erst auf den zweiten blick die kaputten cpp-Tags. entschuldigung deswegen.



  • und zwar folgenden code:

    void main()
    {
        char puffer[] = {"234516789"};
        int i = 0;
        printf("%s", &puffer[0]);
        for(i=0; puffer+i != '1'; i++)
        {
          printf("\n%s", puffer[i]);
        }
    
    }
    

    ergebnis speicherzugriffsfehler, sowohl unter win als unter lin.

    warum das??

    jopperl



  • wenn dann konsequent:

    void main()
    {
        char puffer[] = {"234516789"};
        int i = 0;
        printf("%s", &puffer[0]);
        for(i=0; *(puffer+i) != '1'; i++)
        {
          printf("\n%s", &puffer[i]);
        }
    
    }
    


  • LordJaxom, was willst du uns mit "konsequent" sagen?

    jopperl, LordJaxom hat zwar keine erklaerungen geliefert, aber die unterschiede zu deinem code sollten die noetigen hinweise liefern.

    bei der initialisierung von char arrays mit strings brauchst du keine {}
    statt &puffer[0] schreibe doch bitte puffer
    puffer+i ist eine adresse. du musst sie noch dereferenzieren: *(puffer+i) oder noch besser puffer[i]
    ein %s steht fuer strings, ein %c fuer chars. das printf im loop koennte also so heissen: printf("\n%c", puffer[i]);



  • c.rackwitz schrieb:

    statt &puffer[0] schreibe doch bitte puffer

    Hatte gehofft dass das visuelle Ergebnis dieser syntaktischen Änderung dann die nötigen Hinweise gibt was logisch noch falsch ist 🙂


Anmelden zum Antworten