Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Problem mit array of char - unter C

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.12.2002
    Beiträge
    15

    Problem mit array of char - unter C

    Hi,

    ich habe folgendes Problem. Ich würde gerne eine Verzeichnisliste (sortiert ausgeben).
    Doch wenn ich das Programm so kompiliere, wie ich es hier abgebildet habe, so bekomme ich nach dem Ausführen immer ein Speicherzugriffsfehler.
    Ich konnte den Fehler mitlerweile einkreisen auf die Zeile mit
    Code:
    test[i]=(*dirzeiger).d_name;
    jedoch weiß ich nicht, wie ich es anders realisieren sollte einen "Stack" aus char * zu erstellen !?

    Ich hoffe einer von Euch kann mir helfen, wie man ein Array aus Zeichenketten erstellt und benutzt.

    Ich danke Euch für Eure Hilfe

    Gruß

    Sebastian

    Code:
    t#include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main() 
    {
    	DIR *dir;
    	struct dirent *dirzeiger;
    	char * test[]={};
    	int maxi=0,i=0;
    	if((dir=opendir("/usr")) != NULL) {
    		while((dirzeiger=readdir(dir)) != NULL) {
    			test[i]=(*dirzeiger).d_name;
    			i++;
    		}
    		maxi=i;
    		closedir(dir);
    		// Sortieren
    		char *temp="test";
    		int j = 0;
    		 for(i=0; i<maxi; i++)
    		{
    			for(j=i+1; j<maxi; j++)
    			{
    				 if((strcmp(test[i],test[j])>0))
    				{
    					temp=test[i];
    					test[i]=test[j];
    					test[j]=temp;
    				}
    			}
    		}
    // Ausgabe
    		for (i=0;i<maxi;i++) printf("%s\n",test[i]);
    		
    		printf("Dateien : %i\n",maxi);
    	}
    	else {
    		printf("Konnte Verzeichnis nicht öffnen");
    	}	
    	return (0);
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Hmm...

    Is schon ein wenig lange her, dass ich wirklich mit C gearbeitet habe, also bitte nicht böse sein, wenn alles was ich da sage quatsch ist....

    Soweit ich sehe, versuchst du an ein leeres Array werte zuzuweisen.
    Code:
    char * test[]={};
    Wäre schon O.K. aber leider ist dieses Array 0 pointer lange.

    Wenn du jetzt mit
    Code:
    test[i]=(*dirzeiger).d_name;
    dem [i] elemnt den Wert des Pointers zuweißt, gibt es eine Speicherzugriffsverletzung, da das Array 0 lang ist und du auf i zugreiftst.
    Geändert von Lin728 (19-08-2017 um 19:34 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Die hast ein Array von Pointern erstellt (char *test]) und aber da dirzeiger jedes mal verändert wird, wirst du am Ende von der Schleife, den letzten Wert immer drinnen stehen haben! Machs mit strcpy, oder ähnlich!

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Du brauchst erstmal ein Array von Zeigern auf char.
    Ich hab' es hier mal mit einer festen Größe versehen,sonst mußt du das auch noch dynamisch machen.
    Code:
    	char * test[100];
    Jetzt mußt du für jeden Zeiger auch Speicher anfordern.
    Code:
    while((dirzeiger=readdir(dir)) != NULL)
    {
        test[i] = malloc(strlen((*dirzeiger).d_name) + 1); 
        strcpy(test[i],(*dirzeiger).d_name);
        i++;
    }
    Da fehlt jetzt noch eine Abfrage,ob bereits alle 100 Plätze belegt sind,und am Ende muß noch der Speicher freigeben werden.

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Hmm...

    Original geschrieben von ceisserer

    Soweit ich sehe, versuchst du an ein leeres Array werte zuzuweisen.
    Code:
    char * test[]={};
    Wäre schon O.K. aber leider ist dieses Array 0 pointer lange.
    Das ist nicht mal gültige C Syntax,die {} dürfen nicht leer sein.
    Scheint eine gnu Extension zu sein.

  6. #6
    Registrierter Benutzer
    Registriert seit
    05.12.2002
    Beiträge
    15
    hab jetzt all Eure Dinge einfließen lassen und den Speicher dynamisch mit malloc intialisiert und es funktioniert jetzt ... ich danke Euch allen erstmal für die konstruktive Hilfe.

    @wraith
    ja scheint so zu sein .. ich hoffe, dass es jetzt funktioniert auch auf anderen Plattformen *g*.

    Nochmal herzlichen Dank

    Gruß

    Sebastian

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •