Récupération d'un tableau de chaines de caractères
Résolu/Fermé
scaul
Messages postés
5
Date d'inscription
mercredi 26 novembre 2014
Statut
Membre
Dernière intervention
27 novembre 2014
-
Modifié par scaul le 26/11/2014 à 14:19
scaul Messages postés 5 Date d'inscription mercredi 26 novembre 2014 Statut Membre Dernière intervention 27 novembre 2014 - 27 nov. 2014 à 18:41
scaul Messages postés 5 Date d'inscription mercredi 26 novembre 2014 Statut Membre Dernière intervention 27 novembre 2014 - 27 nov. 2014 à 18:41
A voir également:
- Récupération d'un tableau de chaines de caractères
- Tableau croisé dynamique - Guide
- Tableau word - Guide
- Tableau ascii - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Trier un tableau excel - Guide
4 réponses
productif
Messages postés
39
Date d'inscription
mardi 8 mars 2011
Statut
Membre
Dernière intervention
9 février 2017
20
26 nov. 2014 à 23:55
26 nov. 2014 à 23:55
Là, on a programme qui écrabouille la mémoire de partout... Explications:
opendir renvoie un "stream" ; aucune information sur le nombre de fichiers trouvés. Il est donc impossible d'allouer la bonne taille pour file dès le début. Soit on prévoit une taille fixe mais en prenant soin de ne pas aller au-delà, soit on met en place le mécanisme qui va réallouer de la mémoire à chaque fois que nécessaire. Pas si simple. Dans le présent programme, on va écrire de la mémoire inconnue dès qu'il y a plus de 4 fichiers ((sizeof(rep) * sizeof(char *)) divisé par sizeof(char *)).
=> et le caractère nul de fin de chaîne alors ? Il n'est pas prévu; du coup strcpy va écraser un octet dans une zone inconnue. Il vaut mieux utiliser strdup:
Le main n'affiche pas le tableau car la fonction FileRepList effectue:
au lieu de quelque chose comme :
Bref, la fin n'est pas encore proche...
opendir renvoie un "stream" ; aucune information sur le nombre de fichiers trouvés. Il est donc impossible d'allouer la bonne taille pour file dès le début. Soit on prévoit une taille fixe mais en prenant soin de ne pas aller au-delà, soit on met en place le mécanisme qui va réallouer de la mémoire à chaque fois que nécessaire. Pas si simple. Dans le présent programme, on va écrire de la mémoire inconnue dès qu'il y a plus de 4 fichiers ((sizeof(rep) * sizeof(char *)) divisé par sizeof(char *)).
file[i] = malloc(strlen(lecture->d_name));
strcpy(file[i], lecture->d_name);
=> et le caractère nul de fin de chaîne alors ? Il n'est pas prévu; du coup strcpy va écraser un octet dans une zone inconnue. Il vaut mieux utiliser strdup:
file[i] = strdup(lecture->d_name);
Le main n'affiche pas le tableau car la fonction FileRepList effectue:
file = ...
au lieu de quelque chose comme :
*file = ...
Bref, la fin n'est pas encore proche...
scaul
Messages postés
5
Date d'inscription
mercredi 26 novembre 2014
Statut
Membre
Dernière intervention
27 novembre 2014
Modifié par scaul le 27/11/2014 à 12:05
Modifié par scaul le 27/11/2014 à 12:05
J'ai revu mon programme pour parvenir à cela:
j'arrive à récupérer 2 valeurs puis j'obtiens un "segmentation fault" sur l'execution de la ligne " *file[i] = strdup(temp); " lors du chargement de la 3ème valeur. Peu importe le répertoire visé.
L'allocation est-elle correcte?
int FileRepList(char ***file){
struct dirent *lecture;
DIR *rep;
char *temp;
int i = 0;
rep = opendir(".");
**file = malloc(1 * sizeof(char *));
*file[i] = calloc(1, sizeof(char));
while ((lecture = readdir(rep))) {
printf("%s\n", lecture->d_name);
if((strcmp(lecture->d_name, ".")!=0) && (strcmp(lecture->d_name, "..")!=0)){
temp = calloc(strlen(lecture->d_name), sizeof(char));
temp = strdup(lecture->d_name);
realloc(**file, (i+1) * sizeof(char *));
realloc(*file[i], strlen(temp)* sizeof(char));
*file[i] = strdup(temp);
free(temp);
i = i + 1;
}
}
closedir(rep);
return i;
}
j'arrive à récupérer 2 valeurs puis j'obtiens un "segmentation fault" sur l'execution de la ligne " *file[i] = strdup(temp); " lors du chargement de la 3ème valeur. Peu importe le répertoire visé.
L'allocation est-elle correcte?
scaul
Messages postés
5
Date d'inscription
mercredi 26 novembre 2014
Statut
Membre
Dernière intervention
27 novembre 2014
27 nov. 2014 à 16:46
27 nov. 2014 à 16:46
Voici une version plus épurée:
je suis pratiquement sur que le soucis réside dans la ligne: " **file = malloc(50 * sizeof(char *)); " mais je n'arrive pas à déterminer pourquoi.
Auriez vous une idée?
int FileRepList(char ***file){
struct dirent *lecture;
DIR *rep;
int i = 0;
rep = opendir("..");
**file = malloc(50 * sizeof(char *));
while ((lecture = readdir(rep))) {
printf("%s\n", lecture->d_name);
if((strcmp(lecture->d_name, ".")!=0) && (strcmp(lecture->d_name, "..")!=0)){
*file[i] = (char*) malloc(strlen(lecture->d_name)* sizeof(char));
*file[i] = strdup(lecture->d_name);
i = i + 1;
}
}
closedir(rep);
return i;
}
je suis pratiquement sur que le soucis réside dans la ligne: " **file = malloc(50 * sizeof(char *)); " mais je n'arrive pas à déterminer pourquoi.
Auriez vous une idée?
scaul
Messages postés
5
Date d'inscription
mercredi 26 novembre 2014
Statut
Membre
Dernière intervention
27 novembre 2014
27 nov. 2014 à 18:41
27 nov. 2014 à 18:41
J'ai réussi à trouver une solution à mon problême. Voici mon programme:
int FileRepList(char **file){
struct dirent *lecture;
DIR *rep;
int i = 0;
rep = opendir(".");
while ((lecture = readdir(rep))) {
printf("%s\n", lecture->d_name);
if((strcmp(lecture->d_name, ".")!=0) && (strcmp(lecture->d_name, "..")!=0)){
file[i] = strdup(lecture->d_name);
i = i + 1;
}
}
closedir(rep);
return i;
}
int main()
{
char **file = NULL;
int nb = 0;
int i = 0;
file = (char**) malloc(50 * sizeof(char *));
nb = FileRepList(file);
realloc(file, nb * sizeof(char *));
for(i=0;i<nb;i++){
printf("\nfile[%d]: %s", i, file[i]);
}
free(file);
return 0;
}