Ошибка шины в простой программе на C

У меня есть следующая простая программа. И я запускаю «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;
}

person Jack Kobil    schedule 05.06.2012    source источник


Ответы (4)


не могли бы вы распечатать значение arg[0], предположим, что тип main

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

а argv[0] — имя процесса, argv[1] — первый аргумент.

person RolandXu    schedule 05.06.2012
comment
Нет, у меня также были проблемы с распечаткой arg[0]. - person Jack Kobil; 05.06.2012
comment
поэтому измените основной тип на int main(int argc, char* argv[]) - person RolandXu; 05.06.2012
comment
Хорошо, спасибо! Работал отлично! Изменил ваше предложение и использовал argv[1], и это сработало. - person Jack Kobil; 05.06.2012

Прототип функции входа 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;
}
person Musa    schedule 05.06.2012

Стандартный прототип для 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), чтобы было понятно, что программа завершается успешно.

person steveha    schedule 05.06.2012

argv[0] содержит имя приложения. Попробуйте вместо этого использовать argv[1].

person Jeeva    schedule 05.06.2012
comment
в этом случае arg содержит количество переданных аргументов. - person phoxis; 05.06.2012