我有以下简单的程序。我正在从命令行运行“程序 file.txt”并得到“总线错误”而没有输出。我不知道我在这里做错了什么。
#include<stdio.h>
int main(char *arg[])
{
FILE *file = fopen(arg[0], "r");
if (file == NULL) {
printf("Cannot open file.\n");
exit(1);
}
return 1;
}
c入口函数的原型是
int main(int argc, char *arg[]);
因此,对于您的原型,您实际上是在尝试取消引用 int 以传递给 fopen
试试这个
#include<stdio.h>
int main(int argc, char *argv[])
{
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
printf("Cannot open file.\n");
exit(1);
}
return 1;
}
你能打印出 arg[0] 的值吗,假设 main 的类型是
int main(int argc, char* argv[])
argv[0] 是进程的名称,argv[1] 是第一个参数。
的标准原型main()
应该如下所示:
int main(int argc, char * argv[]);
你main()
只用一个论点声明了你的,argv
. 但是系统将参数计数作为第一个参数传递。
当您指定单个参数(文件file.txt
)时,argc
设置为 1。但您的程序试图使用整数 1 作为char **
. 这给出了总线错误。
这是您的程序的编辑版本,它可以工作:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *file;
if (argc != 2)
{
fprintf(stderr, "Usage: myprogram <filename>\n");
exit(1);
}
file = fopen(argv[1], "r");
if (file == NULL) {
fprintf(stderr, "Cannot open file.\n");
exit(2);
}
exit(0); // status 0 to signal no error
}
变化:
我添加#include <stdlib.h>
以获得exit()
.
我检查参数的数量并打印一个 Usage: 字符串,如果它不正确。
我将错误消息打印到stderr
而不是标准输出。
我改为return 1
明确exit(0)
表示程序正在成功退出。
argv[0]
包含应用程序名称。尝试argv[1]
改用。