【发布时间】:2012-11-15 17:58:04
【问题描述】:
给定一个二维数组,如下所示:
char * Arr[4] =
{
{"124 -346 DATA...."},
{"39479 -32 MOREDATA...."},
{"12 -1 DATA2...."},
{"100 -45 DATA4...."}
};
我正在尝试使用qsort() 根据 SECOND 字段对该函数进行排序,这意味着字符串将根据最低的第二个值(-1、-32、-45 ,-346)。如果每个值只有一个数字,我知道如何实现此功能,但程序中的数字可以任意长。这是我所拥有的,但是程序崩溃了,如果有更有效的方法来对这些数据进行排序,我很乐意在这里(我知道我的方法效率不高)。
排序函数(qsort() 调用):
inline void GetStr(char *ix, char* Result) //call to get second number in function
{
char *spacing; //iterator to traverse
spacing = ix; //iterator = pos of ix
int LEN = 0; //length and offset
int Offset = 0;
while(*spacing != ' ') //while not at end of first num
{
Offset++; //offset is more
spacing++;
}
spacing++; //go one ahead of the space
Offset++;
while(*spacing != ' ') //while not end of second number
{
spacing++;
Offset++;
LEN++; //length of number
}
strncpy(Result, ix + (Offset - LEN),LEN);
}
int sort(const void* a, const void* b)
{
char *ia = *(char**)a;
char *ib = *(char**)b;
char * Str;
char * Str2;
GetStr(ia, Str); //getting some strange errors....... program just crashes
GetStr(ib, Str2);
printf("Str: %s Str2: %s", Str, Str2);
int n1 = atoi(Str);
int n2 = atoi(Str2);
return (n1 > n2);
}
【问题讨论】:
-
根据这个问题和上一个问题,看来你对
qsort有误解。库函数qsort不会直接对文件进行排序。它对您传递的数组进行排序。您可能只需在 Google 上搜索“qsort 示例”并更好地了解它的工作原理。 -
我阅读了stackoverflow.com/questions/3707051/… 并认为我可以,我错了吗?
-
不 - 它不会对文件进行排序。在那个例子中,OP(我相信)实际上是在尝试对 argv 数组进行排序(对传递给程序的实际参数进行排序)。我认为您错过了@BenJackson 对您上一个问题的回答中重要的第一步。您需要读入文件的内容(这意味着编写代码... fopen、fread 或您使用的任何 I/O 函数集)。
-
感谢您的解释,这是否意味着我不需要 agrv 的副本,只需将 const argv[1] 写入数组?
-
我不确定我是否理解了您想要实现的目标。但是,如果您只想独立于参数的顺序,请考虑使用GNU Getopt
标签: c arrays sorting multidimensional-array qsort