Сортировка 2d-массива по столбцу в C

У меня есть код ниже, который может производить

[p18d541@csci112 program1]$ ./main 17 < inp17.txt
 12 25 110 168
 35 64 113 134
 91 158 183 217
 102 129 130 146
 26 116 215 223
 0 78 81 162
 19 25 204 222
 124 138 157 245
 137 183 201 249
 61 67 106 236
 60 71 106 236
 63 81 106 240
 14 27 111 168
 17 27 111 168
 26 116 215 220
 111 137 202 249
 111 137 202 246

от ввода

 168.12.110.25
 64.113.134.35
 217.158.91.183
 102.130.129.146
 215.116.26.223
 81.162.78.0
 19.204.25.222
 245.124.138.157
 137.249.183.201
 106.61.236.67
 106.71.236.60
 106.81.240.63
 168.14.111.27
 168.17.111.27
 215.116.26.220
 137.249.111.202
 137.246.111.202

поэтому мой код сканирует входные данные, сохраняет значения в сети, а затем мне нужно упорядочить их по столбцу от наименьшего к наибольшему, начиная с первого числа и продвигаясь вправо. Примером первых нескольких будет

0 78 81 162
12 25 110 168
14 27 111 168
.
.
.

111 137 202 246
111 137 202 249
.
.
.

.

//declare libraries

 #include <stdio.h>
 #include <stdlib.h>

 //declare other functions/files to be used in the program
 void print_fun(void);
 int sort_fun(int arg, unsigned char networks[arg][4]);
 void read_fun(void);


 //read command line input and store the information
 int main(int argc, char** argv){
     //declar variable
     int arg = 0;

     //make argv into an int
     arg = atoi(argv[1]);
     //assign size to networks
      unsigned char networks[arg][4];

   //assign input to networks
     for (int j =0; j<1; ++j){
         if(argc == 1)
              {
                 printf("ERROR ERROR, you messed up\n");
             }

         else
         {
         // hold network addresses in a 2-d array, with 4 nsigned char

             for(int k = 0; k<arg; k++){
                 for (int i =0; i<4; i++){

                 scanf("%hhu.", &networks[k][i]);
                 //checks to see if scanf was working roperly
                // printf(" %hhu",networks[k][i]);

             }
                //printf("\n");
             }}}

             sort_fun(arg, networks);
 //sort array

 //count networks

 //print info about the array
 return(0);
}

 int sort_fun(int arg, unsigned char networks[arg][4]){
     //declaring variabes

 //sorting by comlumn p
     for (int k = 0; k < arg; k++){
         for( int i = 0; i < 4; i++){
             for (int j = i+1; j<4; ++j){
                 if (networks[k][i] > networks[k][j]) {
                     int swap = networks[k][i];
                     networks[k][i] = networks[k][j];
                     networks[k][j] = swap;
                 }
             }
         }
    }

for (int i =0; i<arg; i++){
     for (int j =0; j < 4; j++){
         printf(" %hhu", networks[i][j]);
         }
         printf("\n");
         }
 return(0);
 }

Я пробовал переключать переменные в моем цикле for и возиться со значениями, но я не могу понять, как изменить мой код, чтобы он работал в столбцах, а не в строках.

и, кстати, каждое значение хранится в отдельном элементе массива, но они должны склеиваться, как и во входных данных, поэтому при перемещении одного числа вся строка перемещается вместе с ним. Пожалуйста, дайте мне знать, что вы думаете. благодарю вас.


person Ivickt    schedule 23.05.2021    source источник
comment
Что вы подразумеваете под упорядочить их по столбцу? Каков ожидаемый результат, который вы на самом деле хотите?   -  person user3386109    schedule 23.05.2021
comment
Я добавил уточнение, пожалуйста, дайте мне знать, если у вас есть другие вопросы.   -  person Ivickt    schedule 23.05.2021
comment
Итак, что-то вроде этого. Эта основная идея заключается в том, что сравнение включает в себя несколько ключей. В вашем случае есть четыре ключа, которые являются четырьмя полями IP-адреса. Это помогает написать функцию сравнения, например. int compare(int addr1[4], int addr2[4]). Функция сравнения должна возвращать -1 (меньше), 0 (равно) или 1 (больше). Начните со сравнения addr1[0] с addr2[0]. Если они не равны, верните -1 или 1 в зависимости от ситуации. В противном случае перейдите к следующему полю. В конце, если все четыре поля совпадают, вернуть 0.   -  person user3386109    schedule 23.05.2021
comment
я действительно не понимаю, как это будет работать, я посмотрел на предоставленный пример, но я не понимаю, как так с массивом, когда он выглядел так, как будто ответ использовал я одномерный массив, и я не понимаю, как переведи это. если мне не нужно использовать цикл for вместо констант?   -  person Ivickt    schedule 23.05.2021
comment
Думайте о проблеме как о сортировке одномерного массива IP-адресов. Функция сортировки нуждается в двух вложенных циклах, например. используя индексы i и j. Элементами массива 1D являются networks[i] и networks[j]. Вы должны иметь возможность сравнивать эти элементы и менять их местами. Итак, напишите функцию compare и функцию swap. Вызовите функцию compare, например result = compare(networks[i], networks[j]). Вызовите функцию swap, например swap(networks[i], networks[j]). Если у вас есть функции, которые могут сравнивать и менять местами IP-адреса, код сортировки будет точно таким же, как сортировка одномерного массива.   -  person user3386109    schedule 24.05.2021