我有以下简单的程序。我从命令行运行“program 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;
}
答案 0 :(得分:3)
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;
}
答案 1 :(得分:2)
你可以打印出arg [0]的值,假设main的类型是
int main(int argc, char* argv[])
并且argv [0]是进程的名称,argv [1]是第一个参数。
答案 2 :(得分: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)
,以明确该程序已成功退出。
答案 3 :(得分:0)
argv[0]
包含应用程序名称。请尝试使用argv[1]
。