1

我有以下简单的程序。我正在从命令行运行“程序 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;
}
4

4 回答 4

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;
}
于 2012-06-05T02:57:59.797 回答
2

你能打印出 arg[0] 的值吗,假设 main 的类型是

int main(int argc, char* argv[])

argv[0] 是进程的名称,argv[1] 是第一个参数。

于 2012-06-05T02:56:23.320 回答
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)表示程序正在成功退出。

于 2012-06-05T02:58:29.493 回答
0

argv[0]包含应用程序名称。尝试argv[1]改用。

于 2012-06-05T02:59:44.520 回答