Ошибка сегментации при поиске уникальных строк в файле - C (СИ)
Формулировка задачи:
Здравствуйте.Есть программа, которая находит уникальные айпи адреса в файле, колличество их повторений и выводит все на печать.
Код:
С компиляцией проблем нет.При запуске выдает ошибку сегметации, когда доходит до вызова функции push если условие count == 0 верно.Думаю, проблема в самой функции push,хотя до этого она работала нормально.
#include <stdio.h> #include <stdlib.h> typedef struct IPform{ int number1; // Числа IP адреса, разделенные точкой int number2; int number3; int number4; int counter; //Счетчик повторений IP адреса struct IPform *next; } IPtemp; void print(IPtemp *list){ IPtemp* first = list; FILE *res = fopen("result.txt", "w"); int len = 1; while( first != NULL ){ printf("%d.%d.%d.%d - %d\n", first -> number1, first -> number2, first -> number3, first -> number4, first -> counter); first = first -> next; len++; } } void push(IPtemp *list, int num1, int num2, int num3, int num4){ //Добавляет в конец списка уникальный айпи адрес while( (list->next)->next != NULL ) list = list -> next; IPtemp *tmp = (IPtemp*)malloc(sizeof(IPtemp)); tmp -> number1 = num1; tmp -> number2 = num2; tmp -> number3 = num3; tmp -> number4 = num4; tmp ->counter = 1; tmp -> next = NULL; list ->next = tmp; } int main(){ FILE *result = fopen("res.txt", "r+"); int num1, num2, num3, num4, count = 0, len = 0; IPtemp new1; new1.number1 = 71; new1.number2 = 164; new1.number3 = 154; new1.number4 = 78; new1.counter = 0; new1.next = NULL; IPtemp new0; new0.number1 = 2; new0.number2 = 95; new0.number3 = 222; new0.number4 = 233; new0.counter = 0; new0.next = &new1; IPtemp *first = &new0; IPtemp *list = &new0; while ( !feof(result) ){ fscanf(result,"%d.%d.%d.%d", &num1, &num2, &num3, &num4); count = 0; while(list != NULL){ if(list -> number1 == num1 && list -> number2 == num2 && list -> number3 == num3 && list -> number4 == num4){ list -> counter++; count++; } list = list->next; } if(count == 0) push(list, num1,num2,num3,num4); list = first; } print(list); return 0; }
Решение задачи: «Ошибка сегментации при поиске уникальных строк в файле»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> typedef struct IPform{ int number1; // Числа IP адреса, разделенные точкой int number2; int number3; int number4; int counter; //Счетчик повторений IP адреса struct IPform *next; } IPtemp; void print(IPtemp *list){ IPtemp* first = list; FILE *res = fopen("result.txt", "w"); int len = 1; while( first != NULL ){ printf("%d.%d.%d.%d - %d\n", first -> number1, first -> number2, first -> number3, first -> number4, first -> counter); first = first -> next; len++; } } void push(IPtemp *list, int num1, int num2, int num3, int num4){ //Добавляет в конец списка уникальный айпи адрес while( list-->next != NULL ) list = list -> next; IPtemp *tmp = (IPtemp*)malloc(sizeof(IPtemp)); tmp -> number1 = num1; tmp -> number2 = num2; tmp -> number3 = num3; tmp -> number4 = num4; tmp ->counter = 1; tmp -> next = NULL; list ->next = tmp; } int main(){ FILE *result = fopen("res.txt", "r+"); int num1, num2, num3, num4, count = 0, len = 0; IPtemp new1; new1.number1 = 71; new1.number2 = 164; new1.number3 = 154; new1.number4 = 78; new1.counter = 0; new1.next = NULL; IPtemp new0; new0.number1 = 2; new0.number2 = 95; new0.number3 = 222; new0.number4 = 233; new0.counter = 0; new0.next = &new1; IPtemp *first = &new0; IPtemp *list = &new0; while ( !feof(result) ){ fscanf(result,"%d.%d.%d.%d", &num1, &num2, &num3, &num4); count = 0; while(list != NULL){ if(list -> number1 == num1 && list -> number2 == num2 && list -> number3 == num3 && list -> number4 == num4){ list -> counter++; count++; } list = list->next; } list = first; if(count == 0) push(list, num1,num2,num3,num4); } print(list); return 0; }
Объяснение кода листинга программы
- В начале кода определяются структура данных IPtemp и две функции: print и push.
- Структура IPtemp содержит поля для хранения чисел IP адреса (number1, number2, number3, number4), счетчика повторений (counter) и указателя на следующий элемент списка (next).
- Функция print выводит на экран все элементы списка в формате
Число.Число.Число.Число - количество
. - Функция push добавляет в конец списка новый элемент с уникальным IP адресом.
- В функции main открывается файл
res.txt
для чтения и создается пустой список. - В цикле, пока не достигнут конец файла, считывается IP адрес и проверяется, есть ли такой же адрес в списке.
- Если адрес не найден, он добавляется в список с помощью функции push.
- После завершения цикла выполняется функция print для вывода списка на экран.
- В конце программы возвращается 0, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д