我想制作一个排序输入行的程序。有一个参数“-f”。这是为了比较字符串和每个上部字符在比较期间被视为较低的字符。为此,我使用了strcasecomp函数。但它没有用。另外要理解我的代码“-n”,以防万一你要用数字方式而不是字典方式对它们进行排序,而-r则用于反向排序。如果我需要发布更多代码,请告诉我。
对于exaple,我这样做:
sort -f
a
A
预期结果应为:
a
A
但我得到
A
a
这是我的主要内容:
int main(int argc, char *argv[])
{
int nlines; /* number of input lines read */
int numeric = 0; /* 1 if numeric sort */
int reverse = 0;
int foldupper = 0;
if (argc > 1 && strcmp(argv[1], "-n") == 0)
numeric = 1;
if (argc > 1 && strcmp(argv[1], "-r") == 0)
reverse = 1;
if (argc > 2 && strcmp(argv[2], "-r") == 0)
reverse = 1;
if (argc > 1 && strcmp(argv[1], "-f") == 0)
foldupper = 1;
if (argc > 2 && strcmp(argv[2], "-f") == 0)
foldupper = 1;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0)
{
if(reverse == 0 && numeric == 1)
{
crescsort((void**) lineptr, 0, nlines-1,(int (*)(void*,void*))(numeric ? numcmp : strcmp));
}
else if(reverse == 0 && numeric == 0)
{
//bug here?
crescsort((void**) lineptr, 0, nlines-1,(int (*)(void*,void*))(foldupper ? strcasecmp : strcmp));
}
else if ( reverse == 1 && numeric == 0 )
{
//or here?
descsort((void**) lineptr, 0, nlines-1,(int (*)(void*,void*))(foldupper ? strcasecmp : strcmp));
}
writelines(lineptr, nlines);
return 0;
}
else
{
printf("input too big to sort\n");
return 1;
}
}
这是排序功能
void crescsort(void *v[], int left, int right,int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int , int );
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
crescsort(v, left, last-1, comp);
crescsort(v, last+1, right, comp);
}
答案 0 :(得分:1)
如果忽略大小写,基本上是a == A.所以两个结果
A
a
和
a
A
是正确的(因为它们是等价的)。实际上,您正在对包含2个条目a和a的列表进行排序。好像你希望保留相同键的顺序,大多数种类不保证。为什么不写一个确实保留顺序的排序: - )
答案 1 :(得分:0)
问题是crescsort()
,因为如果比较的元素相等,它不保证原始订单。
可以特别实施不稳定的排序算法以保持稳定。这样做的一种方式是人为地扩展密钥比较,以便使用原始输入列表中的条目的顺序作为打破平局来确定具有其他相等密钥的两个对象之间的比较。但是,记住这个顺序可能需要额外的时间和空间。维基百科参考Stability
要修复,请更改crescsort()
。
这不是strcasecmp()
问题。