如何将结构数组解析为参数?

时间:2015-01-10 00:31:36

标签: c arrays parsing data-structures

我有这个结构,全局定义(声明)

struct Town
{
 char *TownName;
 char **GiftList;
 int *GiftCount;
 int GiftTypes;
};
int main() 
{
  struct Town TownList[100],AuxiliaryStructure;
}

这是我的排序功能,我使用TownList [i] .GiftList [j],TownList [i] .TownName等。我的问题是如何将这些作为参数发送给函数。非正式的,什么在这些括号之间写下:排序(此处)

void Sort()
{
int i,j,k;
char* AuxiliaryString;
int Auxiliary;
for(i=0;i<TownCount-1;i++)
{
    for(j=i+1;j<TownCount;j++)
    {
        if(strcmp(TownList[i].TownName,TownList[j].TownName)>0)
        {
            AuxiliaryStructure=TownList[i];
            TownList[i]=TownList[j];
            TownList[j]=AuxiliaryStructure;
        }
    }
}
for(i=0;i<TownCount;i++)
{
    for(j=1;j<TownList[i].GiftTypes-1;j++)
    {
        for(k=j+1;k<TownList[i].GiftTypes;k++)
        {
            if(TownList[i].GiftCount[j]<TownList[i].GiftCount[k])
            {
                Auxiliary=TownList[i].GiftCount[j];
                TownList[i].GiftCount[j]=TownList[i].GiftCount[k];
                TownList[i].GiftCount[k]=Auxiliary;
                AuxiliaryString=TownList[i].GiftList[j];
                TownList[i].GiftList[j]=TownList[i].GiftList[k];
                TownList[i].GiftList[k]=AuxiliaryString;
            }
        }

    }
    for(j=1;j<TownList[i].GiftTypes-1;j++)
    {
        for(k=1;k<TownList[i].GiftTypes;k++)
        {
            if(TownList[i].GiftCount[j]==TownList[i].GiftCount[k])
            {
                if(strcmp(TownList[i].GiftList[j],TownList[i].GiftList[k])<0)
                {
                    AuxiliaryString=TownList[i].GiftList[j];
                    TownList[i].GiftList[j]=TownList[i].GiftList[k];
                    TownList[i].GiftList[k]=AuxiliaryString;
                }
            }
        }
    }
}
}

2 个答案:

答案 0 :(得分:1)

要将任何数组传递给函数,您只需将指针传递给第一个元素加上数组长度:

struct mystruct {
  char* something;
  /* ... */
}
struct mystruct myarray[100];

void do_something(struct mystruct* array, int length)
{
  int i;
  for (i=0; i<length; ++i)
  {
    array[i].something = ...
  }
}

int main(void)
{
  do_something(myarray, 100);
  return 0;
}

答案 1 :(得分:0)

根据您所写的内容,您将在调用者中引用它并传递结果。例如:

void sort(char* str){
  ...
}

int main(){
  for(int i=0; i<100; ++i){
    sort(array[i].something);
  }
}

或者,您可能希望传递完整数组并在另一个函数中处理它,如下所示:

void sort(struct mystruct * array){
  ...
}

int main(){
  for(int i=0; i<100; ++i){
    sort(array);
  }
}

另一方面,如果您想要通过某些内容对结构的外部数组进行排序,那么您必须按上述方式传递数组并实现自己的排序,或者使用排序函数它接受一个函数指针,以便您可以编写比较器。后者在标准C库中可用,可以使用类似的东西。

#include <stdlib.h>
int compare_mystruct_by_something(const void *a, const void *b){
    return strcmp(((struct mystruct*)a)->something, ((struct mystruct *)b)->something);
}
int main(){
  qsort(array, 100, sizeof(struct mystruct), compare_mystruct_by_something);
}