Я получил ошибку ошибки сегментации, когда я выполняю функцию cat -b - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу сделать функцию 'cat -b'.

Этот результат идеален, если встретиться с последним шагом.

Я получил ошибку Segmant Fault, и я не знаю, как ее исправить.

Как мне это сделать?

FILE *file_name = NULL;
file_name = fopen(av[2], "r");
char temp[1024], *str;
int cnt_file_number = 1;
while(!feof(file_name)){
    printf("%4.d ", cnt_file_number++);
    str = fgets( temp, sizeof(temp), file_name);
    if(strcmp(str, "\0") == 0 ) break;
    printf("%s", str);
}
fclose(file_name);

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

fgets возвращает нулевой указатель, если обнаружена ошибка. Вы используете str сразу, не проверяя его. Лучшим способом было бы что-то вроде

while(fgets(temp, sizeof(temp), file_name) {
    // your printing code but using temp instead of str
}

Поскольку fgets возвращает либо temp, либо null, вам не нужен этот дополнительный указатель str, и еслизначение равно нулю из-за EOF, цикл завершится должным образом.

Кроме того, проверка feof в вашем условии цикла не выполнит свою работу, потому что несколько символов читаются одновременно и EOF может быть не следующим символом, но средиследующие несколько символов.

Редактировать: о, извините.Я неправильно понялВы на самом деле проверяете, является ли str пустым, но, как отмечали другие в комментариях, есть лучший способ сделать это.Может быть, это даже решает проблему.

0 голосов
/ 28 апреля 2019

Помимо того, что ваша программа не отражает описание того, что будет делать "cat -b", мы не знаем, что такое av[2]; поэтому, не сообщая, существует ли этот файл или доступен для чтения. Было бы разумно проверить fopen(), чтобы убедиться, что он открывает действительный файл. Если это не так, он возвращает NULL и feof(NULL) не удастся.

Кроме того, если вы прочитаете после конца файла, str == NULL и strcmp(NULL,...) завершатся ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...