将字符串与c中的多个数组进行比较

时间:2014-07-12 21:28:07

标签: c linux string

结束游戏是将目录中文件的扩展名与2个单独的数组字符串进行比较,然后将其排序并将其放入2个不同的文件夹中。

我在比较两个不同数组的字符串时遇到问题.. esp有两个不同大小的字符串数组..

任何建议都表示赞赏..

#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;
}

2 个答案:

答案 0 :(得分:1)

您遇到的一个大问题是数组通常不会以任何方式终止。所以在你的循环中

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

你最有可能走出界限,并继续迭代,直到内存中有一个NULL,这可能远远超出界限。访问数组越界导致undefined behavior并使您的整个程序怀疑错误和非法,即使它可能编译正常且没有警告。


要解决此问题,您可以使用一个小技巧来计算数组中的数字条目:

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

请注意,此技巧仅适用于正确的数组。你必须记住数组经常衰减到指针,例如当一个数组作为参数传递给一个函数时,然后这个技巧将不起作用。

答案 1 :(得分:1)

您的for loop正在寻找要停止的NULL值,但您没有为数组设置NULL值。
因此,extMov[i] != NULL可能永远不会被找到(取决于你记忆的内容)

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

我明确地添加一个NULL作为我的数组的最后一个条目,以确保拥有它。