2014-07-12 3 views
1

jeu final était de comparer les extensions des fichiers dans le répertoire à 2 cordes séparées des tableaux que je pouvais trier et de le mettre 2 dossiers différents ..comparer une chaîne à un tableau multiple dans c

J'ai un problème comparant les chaînes de deux tableaux différents .. esp avec 2 différents tableaux de chaînes de taille ..

suggestions est apprécié ..

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <string.h> 

int main (void) 
{ 
DIR *dirP; 
struct dirent *dp; 
char *fileN; int i = 0; 
char *extMov[]= {".mp4",".flv"}; 
char *extMusic[]= {".mp3"}; 

dirP = opendir ("/Users/abc/Downloads"); 
if (dirP != NULL) 
{ 
    while ((dp = readdir(dirP)) != NULL) 
    { 
    if((fileN = strrchr(dp->d_name,'.')) != NULL) 
    { 
    for (i=0; extMov[i] != NULL; i++) 
    { 
    if(strcmp (fileN,extMov[i]) == 0) 
    { 
     printf("%s\n",dp->d_name); 
    } 
    } 
    } 
    } 
    closedir(dirP); 
} 
else 
    perror (" Could not open the directory\n"); 
return 0; 
} 

Répondre

1

Le grand problème que vous avez est que les tableaux ne sont pas normalement pris fin en en tous cas. Donc, dans votre boucle

for (i=0; extMov[i] != NULL; i++) 

vous intensifiera probablement hors limites, et continuer jusqu'à ce itérer il y a une NULL quelque part en mémoire, ce qui pourrait être assez loin des limites. L'accès à un tableau hors limites conduit à undefined behavior et rend tout votre programme suspect d'erreurs et d'illégalités, même s'il peut être compilé correctement et sans avertissement.


Pour résoudre ce problème, vous pouvez utiliser une petite astuce pour calculer les entrées numériques dans un tableau:

for (i=0; i < sizeof(extMov)/sizeof(extMov[0]); i++) 

Prenez note cependant que cette astuce ne fonctionne que sur les tableaux appropriés. Vous devez vous rappeler que les tableaux se désintègrent souvent en pointeur, par exemple en passant un tableau en argument d'une fonction, et cette astuce ne fonctionnera pas.

+0

cette idée fonctionne certainement .. mais existe-t-il un moyen de comparer 2 tableaux dans ce cas, extMov et extMusic en un seul passage (de pour boucle)? le problème auquel je suis confronté est que les deux tableaux seront différents, donc j'ai besoin de 2 boucles pour faire le travail ... – vinay

+1

Si la taille du tableau n'est pas la même, oui en utilisant deux pour les boucles sera le meilleur choix. – MoiTux

1

votre for loop recherche une valeur NULL à arrêter, mais vous n'avez pas défini de valeur NULL pour votre tableau.
Donc, ce extMov[i] != NULL jamais retrouvés (en fonction du contenu de votre mémoire)

char *extMov[]= {".mp4",".flv", NULL}; 

ajouter explicitement une valeur NULL comme la dernière entrée de mon tableau pour être sûr de l'avoir.

Questions connexes