C语言: 我想问一下如何在等效的小写字母之前用大写字母按字母顺序对字符串进行排序。 例: 输入:baBadxD 输出:aaBbDdx
答案 0 :(得分:3)
必要的比较功能不是很复杂。您可以对字符进行大小写转换并进行比较。如果它们不相等,请在case转换后的值上使用(x > y) - (x < y)
惯用语来返回值。如果它们相等,请使用相同的成语来比较未转换的字符。
代码确实假设大写字母字符位于代码集中的小写字母字符之前。它使用一个断言来确保 - 它可能是static_assert()
产生编译时错误而不是运行时错误。如果你需要担心重音字符,你需要进行更复杂的比较,如果只是为了确保áàäâå等组合在一起。
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int comparator(const void *v1, const void *v2)
{
unsigned char c1 = *(unsigned char *)v1;
unsigned char c2 = *(unsigned char *)v2;
unsigned char u1 = toupper(c1);
unsigned char u2 = toupper(c2);
if (u1 != u2)
return (u1 > u2) - (u1 < u2);
return (c1 > c2) - (c1 < c2);
}
int main(void)
{
assert('A' < 'a');
char sample[] = "baBadxD";
printf("Unsorted [%s]\n", sample);
qsort(sample, strlen(sample), sizeof(char), comparator);
printf("Sorted [%s]\n", sample);
char buffer[4096];
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
buffer[strcspn(buffer, "\n")] = '\0';
printf("Unsorted [%s]\n", buffer);
qsort(buffer, strlen(buffer), sizeof(char), comparator);
printf("Sorted [%s]\n", buffer);
}
return 0;
}
测试代码对问题中给出的样本数据进行排序,然后读取更多的数据行并对每个数据进行排序。给定一个随机文本生成器,一些示例输出是:
Unsorted [baBadxD]
Sorted [aaBbDdx]
Unsorted [PvpxixCDvgnkLHQLlBvsJzgQLDmBxUeIhyUMvDiVpjCYvOshnaEvupb]
Sorted [aBBbCCDDDEeggHhhIiiJjkLLLlMmnnOPpppQQssUUuVvvvvvvxxxYyz]
Unsorted [rvnsnRcQGUGDyydxrvIhYkQemsqfNtafIZlVQqHvDxkLnxdQouwBrv]
Sorted [aBcDDddeffGGHhIIkkLlmNnnnoQQQQqqRrrrsstUuVvvvvwxxxYyyZ]
Unsorted [XZPIDAxazwWQZhxuCVotQPzTHsCQULaEiSPLAQUlnqrBiz]
Sorted [AAaaBCCDEHhIiiLLlnoPPPQQQQqrSsTtUUuVWwXxxZZzzz]
Unsorted [NoAsbAzTWivuxSHjBKnGeDxgmWdwNESTZmZauGvmdchoGjMAAEufcZneoWWWN]
Sorted [AAAAaBbccDddEEeefGGGgHhijjKMmmmNNNnnoooSSsTTuuuvvWWWWWwxxZZZz]
Unsorted [zcmMqAkXYXrmObgDsloVxVLfmXclNGBmDfrtVEcgHVZlRaycjbnYbSQkS]
Sorted [AaBbbbccccDDEffGggHjkkLlllMmmmmNnOoQqRrrSSstVVVVXXXxYYyZz]
Unsorted [DHvDBHSsTgAjBaZGCXniiBqzSNkNqgeKStXzDDswSfCcJnJJSAKsmhz]
Sorted [AAaBBBCCcDDDDefGggHHhiiJJJjKKkmNNnnqqSSSSSsssTtvwXXZzzz]
Unsorted [MGKtMuBlwdXTjysBPDhHntdGvsjRPOWlGvKTCTs]
Sorted [BBCDddGGGHhjjKKllMMnOPPRsssTTTttuvvWwXy]
Unsorted [ChNiqW]
Sorted [ChiNqW]
答案 1 :(得分:1)
您可以将qsort
函数与适当的比较函数一起使用。必须精心设计这样的函数以实现传递排序功能。 Vlad,Jonathan和我的共同努力导致了这种简单易用的实现:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmpletters(const void *p1, const void *p2) {
unsigned char c1, c2, u1, u2;
c1 = *(const unsigned char *)p1;
c2 = *(const unsigned char *)p2;
if (c1 == c2)
return 0;
u1 = toupper(c1);
u2 = toupper(c2);
if (u1 != u2)
return (u1 > u2) ? 1 : -1;
return isupper(c1) ? -1 : 1;
}
int main(void) {
char buf[] = "baBadxD";
printf("before: %s\n", buf);
qsort(buf, strlen(buf), 1, cmpletters);
printf("sorted: %s\n", buf);
return 0;
}
请注意,除非char
类型非常大,否则也可以使用查找表实现此算法。
答案 2 :(得分:0)
我们需要仔细编写比较函数,并使用标题qsort
中声明的C标准排序函数<stdlib.h>
。
这是一个示范程序。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int cmp_char(const void *lhs, const void *rhs)
{
unsigned char c1 = *(const unsigned char *)lhs;
unsigned char c2 = *(const unsigned char *)rhs;
if (c1 == c2)
{
return 0;
}
else if ( ( toupper(c1) < toupper(c2) ) ||
( toupper( c1 ) == toupper( c2 ) && isupper(c1) && islower(c2) ))
{
return -1;
}
else
{
return 1;
}
}
int main( void )
{
char s[] = "baBadxD";
puts(s);
qsort(s, strlen(s), sizeof(char), cmp_char);
puts(s);
}
程序输出
baBadxD
aaBbDdx