C语言读取输入文件首行程序报invalid initializer错误如何解决
错误产生原因
C语言语法明确规定,字符数组初始化仅支持字符串字面量、初始化值列表两种合法形式。你代码中char filename[1024] = argv[1];里的argv[1]是char *类型的字符串指针,不属于数组初始化支持的合法值,因此会触发invalid initializer编译报错。
补充说明:原代码还存在两个隐性问题:
- 缺少入参合法性判断,如果用户执行程序时未传入文件名参数,
argv[1]会是空指针,运行时会直接触发段错误 - 大括号匹配错误,
return 0写在了file != NULL的判断分支内部,如果文件打开失败程序没有合法返回值
修复方案
以下是两种常用的修复方式:
- 方案1:直接复用
argv[1]指针,无需额外定义filename数组fopen函数的第一个入参本身就接收const char *类型的参数,你可以直接把argv[1]传入,不需要额外拷贝到字符数组,修改后完整代码如下:
#include <stdio.h> int main (int argc, char **argv) { // 先校验入参数量 if(argc < 2){ fprintf(stderr, "用法:%s 目标文本文件名\n", argv[0]); return 1; } FILE* file; char scratch[1024]; // 直接传入argv[1]作为文件名参数 file = fopen(argv[1], "r"); if(file == NULL){ perror("文件打开失败"); return 1; } if(fgets(scratch, 1024, file) != NULL){ fprintf(stdout, "read line: %s", scratch); } fclose(file); return 0; }
- 方案2:如果确实需要把文件名拷贝到本地数组保存,使用
strcpy完成字符串拷贝
需要额外引入<string.h>头文件调用字符串拷贝函数,修改后核心代码段如下:
#include <stdio.h> #include <string.h> // 引入字符串操作头文件 int main (int argc, char **argv) { if(argc < 2){ fprintf(stderr, "用法:%s 目标文本文件名\n", argv[0]); return 1; } FILE* file; char scratch[1024]; char filename[1024]; // 用strcpy把argv[1]指向的字符串拷贝到filename数组中 strcpy(filename, argv[1]); // 如需避免长文件名溢出,可改用更安全的strncpy: // strncpy(filename, argv[1], sizeof(filename)-1); // filename[sizeof(filename)-1] = '\0'; // 手动补字符串结束符 file = fopen(filename, "r"); // 后续逻辑同方案1,省略...
内容的提问来源于stack exchange,提问作者Malek Haddad
相关产品推荐
相关产品推荐

