我只需要知道如何将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
。我做错了什么?
答案 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.
}
}