检查C中字符串数组中的字符串

时间:2012-02-21 05:43:34

标签: c static

我有一个函数,它接受一个文件名(字符串),我希望有一个文件名(字符串)数组来检查文件名是否传入是否在数组中,如果没有添加到它。这是我到目前为止所得到的。

bool read_file(char * filename, bool warnings){
  //Check to see if filename is in array files
  static char * files[MAXFILES];
  static int counter = 0;
  for(int i=0;i<counter;i++){
    if(strcmp(filename,files[i]) == 0){
      fprintf(stdout, "Error\n");
      return 0;
    }
    else{
      files[counter]=filename;
      counter++;
    }
  }
  FILE * fp = fopen(filename,"r");
  if(fp == NULL){
    if(warnings){
      fprintf(stderr, "Can't open the file %s\n",filename);
      return 0;
    }
    else{
      return 0;
    }
  }
  else{
    fclose(fp);
    fp = NULL;
    return 1;
  }
}

由于某种原因,它不会将文件名添加到文件[]任何帮助将被批准。

4 个答案:

答案 0 :(得分:1)

第一次看看你的循环(i == 0counter == 0时):

static int counter = 0;
for(int i = 0; i < counter; i++) {
    // this never runs
}

i < counter始终为false,因为counter在for循环的主体中递增。

你需要重新思考你的逻辑。这个功能正在做很多事情。也许像这样循环的东西会有所帮助:

if (counter == 0) {
    // first time in the function, just add the filename
    files[counter]=filename;
    counter++;
}
else {
    for (int i = 0; i < counter; i++) {
        ...
    }
}

但是,您可能会将此分成几个函数。一个用于向数组添加文件名,另一个用于检查文件是否已存在,第三个用于打开文件等。

答案 1 :(得分:1)

查看此循环的else子句:

  for(int i=0;i<counter;i++){
    if(strcmp(filename,files[i]) == 0){
      fprintf(stdout, "Error\n");
      return 0;
    }
    else{
      files[counter]=filename;
      counter++;
    }
  }

只有当您知道文件不在列表中时才想将文件添加到列表中,并且在完成整个列表之前您不会知道该文件。所以,该代码应该看起来像:

for (int i = 0; i < counter; i++)
{
    if (strcmp(filename, files[i]) == 0)
    {
      fprintf(stdout, "Duplicate file %s found at %d\n", filename, i);
      return 0;
    }
}
files[counter++] = filename;

请注意比“错误”更好的错误消息。你需要知道出了什么问题,因为这不会是程序中唯一可能出错的地方。您可以辩论这个数字是否有用;这个名字当然是,但拥有索引号也可能对你有帮助。

答案 2 :(得分:1)

您的else放错了地方。这样:

 for(int i=0;i<counter;i++){
    if(strcmp(filename,files[i]) == 0){
      fprintf(stdout, "Error\n");
      return 0;
   }
   else{
      files[counter]=filename;
      counter++;
   }
}

永远不会被输入,如果是,它会一直认为该文件在列表中,因为您在完成检查之前将其附加。然后你会找到你附加的那个,并认为它已经存在。

相反,等到你检查完整个列表后再添加文件名:

for(int i=0;i<counter;i++){
   if(strcmp(filename,files[i]) == 0){
     fprintf(stdout, "Error\n");
     return 0;
   }
}
files[counter]=filename;
counter++;

关键是return 0重定向流出函数,而不是else子句。你知道,只要循环结束,你仍然处于文件名不存在的函数中。

答案 3 :(得分:0)

将您的for循环更改为

 for (i=0;i<=counter;i++)