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