Я пытаюсь открыть файл и посмотреть, сколько строк, слов, символов и предложений содержится в файле. Все компилируется нормально, но когда программа запускается, он печатает инструкции, тогда возникает ошибка «ошибка сегментации (core dumped)». Я знаю, что файл открывается отлично, поэтому я предполагаю, что я делаю что-то неправильно в processFile. Помогите было бы здорово!У меня проблемы с ошибкой сегментации C
P.S. #include «lib09.h» являются три функции после того, как основной()
#include <stdio.h>
#include <stdlib.h>
#include "lib09.h"
int main(void)
{
FILE *fileIn;
int *lines = 0,
*words = 0,
*sentences = 0,
*characters = 0;
printInstructions();
fileIn = fopen("input09.txt", "r");
if (fileIn == NULL)
{
printf("\n\nERROR\n");
printf("FILE DOES NOT EXIST.\n");
printf("TRY AGAIN\n\n");
}
else
{
processFile(fileIn);
printReport(lines, words, characters, sentences);
}
return 0;
}
//
//Prints Instructions
//
void printInstructions()
{
printf("\n====================================================\n");
printf(" Program reads a file and returns the number of \n");
printf("lines, words, characters, and sentences in the file.\n");
printf("====================================================\n\n");
return;
}
//
//Processes File
//
int processFile(FILE *fileIn)
{
int ch,
*lines = 0,
*sentences = 0,
*characters = 0,
*words = 0;
while(fscanf(fileIn, "%d", &ch) != EOF)
{
ch = fgetc(fileIn);
if(ch == '\n' || ch == 60)
return *lines++;
if(ch == '.')
return *sentences++;
if(ch != ' ' || ch != '.' || ch != '\n')
return *characters++;
if(ch == ' ')
return *words++;
}
fclose(fileIn);
return 0;
}
//
//Prints Values from File
//
void printReport(int *words, int *lines, int *characters, int *sentences)
{
printf("This file contains %d lines.\n", *lines);
printf("This file contains %d words.\n", *words);
printf("This file contains %d characters.\n", *characters);
printf("This file contains %d sentences.\n\n", *sentences);
return;
}
Вы пишете четыре нулевых указателей в вашей '' функции ProcessFile(). Довольно уверен, что вы хотели передать эти параметры в качестве адресных входных параметров функции и передать параметры '& var' обратно на стороне вызывающего абонента. Конечно, сама функция в любом случае ошибочна, так как она будет неправильно возвращать момент, когда любой символ обрабатывается в любом случае. Я не думаю, что, учитывая имя функции *, любой из этих операторов 'return' должен быть там. – WhozCraig
Ах, да, ежедневная «Я пишу в ячейки памяти, где ничего не возникает, почему я получаю вопрос segfault». Голосовать, чтобы закрыть. – Lundin