Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中结构数组的合并与排序_C_Arrays_Linux_Sorting_Struct - Fatal编程技术网

c语言中结构数组的合并与排序

c语言中结构数组的合并与排序,c,arrays,linux,sorting,struct,C,Arrays,Linux,Sorting,Struct,我正在尝试制作一个c99程序,用于报告使用WiFi的设备下载的字节数 它接收一个数据包文件作为输入,每个数据包被排序到一个包含mac id和数据包大小的结构数组中 现在,我尝试按升序排序结构数组,添加相同mac地址的字节并删除添加的记录 #包括 #包括 #包括 #定义数据包“示例数据包” #定义MAXMACADD 500 结构包结构{ char-mac[17]; 整数大小; }packetStruct[MAXMACADD]; 结构输出{ char-mac[17]; 整数大小; }输出[MAXMA

我正在尝试制作一个c99程序,用于报告使用WiFi的设备下载的字节数

它接收一个数据包文件作为输入,每个数据包被排序到一个包含mac id和数据包大小的结构数组中

现在,我尝试按升序排序结构数组,添加相同mac地址的字节并删除添加的记录

#包括
#包括
#包括
#定义数据包“示例数据包”
#定义MAXMACADD 500
结构包结构{
char-mac[17];
整数大小;
}packetStruct[MAXMACADD];
结构输出{
char-mac[17];
整数大小;
}输出[MAXMACADD];
无效排序大小(结构packetStruct*macadd,int n){
int j,i;
对于(i=1;i
可以使用以下命令行在命令行中编译:

$: gcc main.c
运行时使用:

$: ./a.out packets
排序很好,但合并是个问题。我应该使用另一个名为output的结构并将值存储在其中,还是合并当前数组?时间效率是不必要的


如果有用,我可以提供示例输入文件。

如果我正确理解了您的意思,您希望从同一mac地址添加所有大小的文件。然后
mergeMac2()
应该是这样的(edit:现在它是一个完全保留原始
macadd
数组的版本):

至少我认为你应该先合并然后排序,当然这取决于你想要实现什么

void mergeMac2(结构包结构*macadd,结构输出*output,int n)
void mergeMac2(struct packetStruct* macadd, struct output* output, int n)
{
    int i, j, k = 0;

    for (i = 0; i < n; i++) {
        /*
         * If size is 0, the packet has already been processed.
         */
        if (macadd[i].size == 0)
           continue;

        memcpy(&output[k], &macadd[i], sizeof(struct packetStruct));

        for (j = i+1; j < n; j++) {
            /*
             * If size is 0, the packet has already been processed.
             */
            if (macadd[j].size == 0)
               continue;

            if (strcmp(macadd[i].mac, macadd[j].mac) == 0) {
                output[k].size += macadd[j].size;

                /*
                 * Set size to 0 so that these packets won't be
                 * processed in the next pass.
                 */
                macadd[j].size = 0;
            }
        }
        k++;
    }
}
{ int i,j,k=0; 对于(i=0;i
mergeMac2函数没有将所有相同的mac id合并在一起。请正确缩进代码。提示:使用制表符不起作用。要我重新发布吗?您有两种结构类型,
struct packetStruct
struct output
包含相同的数据字段,这似乎很奇怪。只使用一种结构类型不是更简单吗?
int j, n;
...
n = mergeMac2( packetStruct, output, i );
for( j=0; j<n; j++ ) {
    ...
} 
void mergeMac2(struct packetStruct* macadd, struct output* output, int n)
{
    int i, j, k = 0;

    for (i = 0; i < n; i++) {
        /*
         * If size is 0, the packet has already been processed.
         */
        if (macadd[i].size == 0)
           continue;

        memcpy(&output[k], &macadd[i], sizeof(struct packetStruct));

        for (j = i+1; j < n; j++) {
            /*
             * If size is 0, the packet has already been processed.
             */
            if (macadd[j].size == 0)
               continue;

            if (strcmp(macadd[i].mac, macadd[j].mac) == 0) {
                output[k].size += macadd[j].size;

                /*
                 * Set size to 0 so that these packets won't be
                 * processed in the next pass.
                 */
                macadd[j].size = 0;
            }
        }
        k++;
    }
}