Ошибка сегментации при поиске уникальных строк в файле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте.Есть программа, которая находит уникальные айпи адреса в файле, колличество их повторений и выводит все на печать. Код:
#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;
}
С компиляцией проблем нет.При запуске выдает ошибку сегметации, когда доходит до вызова функции push если условие count == 0 верно.Думаю, проблема в самой функции push,хотя до этого она работала нормально.

Решение задачи: «Ошибка сегментации при поиске уникальных строк в файле»

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;
}

Объяснение кода листинга программы

  1. В начале кода определяются структура данных IPtemp и две функции: print и push.
  2. Структура IPtemp содержит поля для хранения чисел IP адреса (number1, number2, number3, number4), счетчика повторений (counter) и указателя на следующий элемент списка (next).
  3. Функция print выводит на экран все элементы списка в формате Число.Число.Число.Число - количество.
  4. Функция push добавляет в конец списка новый элемент с уникальным IP адресом.
  5. В функции main открывается файл res.txt для чтения и создается пустой список.
  6. В цикле, пока не достигнут конец файла, считывается IP адрес и проверяется, есть ли такой же адрес в списке.
  7. Если адрес не найден, он добавляется в список с помощью функции push.
  8. После завершения цикла выполняется функция print для вывода списка на экран.
  9. В конце программы возвращается 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы