如何将FILE *数组传递给函数

时间:2018-02-19 00:08:54

标签: c arrays file pointers

我只需要知道如何将FILE*数组传递给函数

void openInputFiles(char* name, FILE* input[]){
    char filename[10];
    if (strcmp("average", name) == 0){
        int i;
        int k =1;
        for (i=1;i<=10;i++){
            if (i<10){
                sprintf(filename,"%s_00%d",name,k);
            }
            if (i == 10){
                sprintf(filename,"%s_0%d",name,k);
            }
            input[i-1] = fopen(filename,"r");
            k++;
        }
    }
    if (strcmp("median", name) == 0){
        int i,k;
        k=1;
        for (i=1;i<10;i++){
            sprintf(filename,"%s_00%d",name,k);
            input[i-1] = fopen(filename,"r");
            k++;
        }
    }
}

这是该功能的代码,这就是我试图称之为

的地方
int main(int argc, char* argv[]){

    FILE* input[10];

    openInputFiles(argv[1],input);
}

我编译时没有收到任何警告,但是当我尝试gdb来测试它的错误时,它似乎FILE*没有分配内容地址为input[0],因为它表示地址为0x0。我做错了什么?

1 个答案:

答案 0 :(得分:2)

char filename[10];
...
sprintf(filename,"%s_00%d",name,k);

正如user3121023正确指出的那样,没有足够的空间来容纳&#34; average_001&#34;到您为文件名分配的9个字符(加上终止NUL)。您需要将其设为char filename[12];或更大。因此,您的程序会显示未定义的行为,这意味着可能发生任何

你也应该〜永远不要使用sprintf - 改用snprintf总是检查错误,如下所示:

if (snprintf(filename, sizeof(filename), "%s_00%d", name, k) >= sizeof(filename)) {
  abort();  // filename is too short.

您还可以简化循环(绝对无需处理i == 1到9,与i == 10不同:

for (i = 0; i < 10; i++) {
  int n = snprintf(filename, sizeof(filename), "%s_%03d", name, i + 1);
  if (n == -1 || n >= sizeof(filename) {
    // handle format error or "filename" too short here.
  }
  input[i] = fopen(filename, "r");
  if (input[i] == NULL) {
    // handle fopen failure here.
  }
}