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

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

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

Здравствуйте.Есть программа, которая находит уникальные айпи адреса в файле, колличество их повторений и выводит все на печать. Код:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct IPform{
  4. int number1; // Числа IP адреса, разделенные точкой
  5. int number2;
  6. int number3;
  7. int number4;
  8. int counter; //Счетчик повторений IP адреса
  9. struct IPform *next;
  10. } IPtemp;
  11. void print(IPtemp *list){
  12. IPtemp* first = list;
  13. FILE *res = fopen("result.txt", "w");
  14. int len = 1;
  15. while( first != NULL ){
  16. printf("%d.%d.%d.%d - %d\n", first -> number1, first -> number2, first -> number3, first -> number4, first -> counter);
  17. first = first -> next;
  18. len++;
  19. }
  20. }
  21. void push(IPtemp *list, int num1, int num2, int num3, int num4){ //Добавляет в конец списка уникальный айпи адрес
  22. while( (list->next)->next != NULL )
  23. list = list -> next;
  24. IPtemp *tmp = (IPtemp*)malloc(sizeof(IPtemp));
  25. tmp -> number1 = num1;
  26. tmp -> number2 = num2;
  27. tmp -> number3 = num3;
  28. tmp -> number4 = num4;
  29. tmp ->counter = 1;
  30. tmp -> next = NULL;
  31. list ->next = tmp;
  32. }
  33. int main(){
  34. FILE *result = fopen("res.txt", "r+");
  35. int num1, num2, num3, num4, count = 0, len = 0;
  36. IPtemp new1;
  37. new1.number1 = 71;
  38. new1.number2 = 164;
  39. new1.number3 = 154;
  40. new1.number4 = 78;
  41. new1.counter = 0;
  42. new1.next = NULL;
  43. IPtemp new0;
  44. new0.number1 = 2;
  45. new0.number2 = 95;
  46. new0.number3 = 222;
  47. new0.number4 = 233;
  48. new0.counter = 0;
  49. new0.next = &new1;
  50.  
  51. IPtemp *first = &new0;
  52. IPtemp *list = &new0;
  53. while ( !feof(result) ){
  54. fscanf(result,"%d.%d.%d.%d", &num1, &num2, &num3, &num4);
  55. count = 0;
  56. while(list != NULL){
  57. if(list -> number1 == num1 && list -> number2 == num2 && list -> number3 == num3 && list -> number4 == num4){
  58. list -> counter++;
  59. count++;
  60. }
  61. list = list->next;
  62. }
  63. if(count == 0)
  64. push(list, num1,num2,num3,num4);
  65. list = first;
  66. }
  67. print(list);
  68. return 0;
  69. }
С компиляцией проблем нет.При запуске выдает ошибку сегметации, когда доходит до вызова функции push если условие count == 0 верно.Думаю, проблема в самой функции push,хотя до этого она работала нормально.

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct IPform{
  5.     int number1; // Числа IP адреса, разделенные точкой
  6.     int number2;
  7.     int number3;
  8.     int number4;
  9.     int counter; //Счетчик повторений IP адреса
  10.     struct IPform *next;
  11. } IPtemp;
  12.  
  13. void print(IPtemp *list){
  14.     IPtemp* first = list;
  15.     FILE *res = fopen("result.txt", "w");
  16.  
  17.     int len = 1;
  18.  
  19.     while( first != NULL ){
  20.         printf("%d.%d.%d.%d  -  %d\n", first -> number1, first -> number2, first -> number3, first -> number4, first -> counter);
  21.         first = first -> next;
  22.         len++;
  23.        
  24.     }
  25.  
  26. }
  27. void push(IPtemp *list, int num1, int num2, int num3, int num4){ //Добавляет в конец списка уникальный айпи адрес
  28.  
  29.     while( list-->next != NULL )
  30.         list = list -> next;
  31.    
  32.     IPtemp *tmp = (IPtemp*)malloc(sizeof(IPtemp));
  33.  
  34.     tmp -> number1 = num1;
  35.     tmp -> number2 = num2;
  36.     tmp -> number3 = num3;
  37.     tmp -> number4 = num4;
  38.     tmp ->counter = 1;
  39.     tmp -> next = NULL;
  40.     list ->next = tmp;
  41.    
  42. }
  43.  
  44. int main(){
  45.  
  46.     FILE *result = fopen("res.txt", "r+");
  47.     int num1, num2, num3, num4, count = 0, len = 0;
  48.     IPtemp new1;
  49.     new1.number1 = 71;
  50.     new1.number2 = 164;
  51.     new1.number3 = 154;
  52.     new1.number4 = 78;
  53.     new1.counter = 0;
  54.     new1.next = NULL;
  55.  
  56.     IPtemp new0;
  57.     new0.number1 = 2;
  58.     new0.number2 = 95;
  59.     new0.number3 = 222;
  60.     new0.number4 = 233;
  61.     new0.counter = 0;
  62.     new0.next = &new1;
  63.    
  64.    
  65.     IPtemp *first = &new0;
  66.     IPtemp *list = &new0;
  67.  
  68.     while ( !feof(result) ){
  69.        
  70.                 fscanf(result,"%d.%d.%d.%d", &num1, &num2, &num3, &num4);
  71.  
  72.         count = 0;
  73.        
  74.         while(list != NULL){
  75.  
  76.             if(list -> number1 == num1 && list -> number2 == num2 && list -> number3 == num3 && list -> number4 == num4){
  77.                 list -> counter++;
  78.                 count++;
  79.             }
  80.            
  81.             list = list->next;
  82.         }
  83.  
  84.         list = first;
  85.  
  86.         if(count == 0)
  87.             push(list, num1,num2,num3,num4);
  88.     }
  89.    
  90.     print(list);
  91.  
  92.         return 0;
  93. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы