Ошибка сегментации при поиске уникальных строк в файле - 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, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д