C语言: 我想问如何在等效小写字母前用大写字母按字母顺序排序字符串。 例如: 输入:baBadxD 输出:aaBbDdx排序字符串在C中的小写字母前加大写字母字母排序
1
A
回答
1
可以使用qsort
功能与适当的比较函数。这样的功能必须精心设计以实现传递式排序功能。从弗拉德,乔纳森和我集体的力量导致这种简单便携的实现:
#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
是非常大的。
0
需要仔细编写比较功能,并使用标头<stdlib.h>
中声明的C标准分类功能qsort
。
这是一个示范程序。
#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
+0
好又简单!为了完全的可移植性,我会在'main()'的末尾添加可选的'return 0;'。 upvoted。 – chqrlie
3
必要的比较功能不是很复杂。你可以大小写转换字符并进行比较。如果它们不相等,则使用案例转换值的成语(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. 在C中使用大写字母和小写字母对字符串排序
- 2. Java如何在大写字母串之前对小写字母进行排序
- 3. C#字符串进行排序小和大写字母
- 4. Python:如何对字符串中的字母进行排序按字母顺序排列大写字母和小写字母之间的区别
- 5. R:在字母区分大小写顺序的一串向量排序字母
- 6. 带大写字母和小写字母的字符串转换
- 7. 在python中排序小写字母
- 8. 以大写字母顺序排列字符串C++
- 9. 在每个大写字母后加小写字母后加小写字母
- 10. 大写字母和小写字母
- 11. 字母数字大小写在postgres中的敏感排序
- 12. 首字母大写的字符串首字母大写
- 13. 排序NSArray的大写字母
- 14. 排序数字串字母
- 15. 排序字母数字串
- 16. 字母数组排序 - 小写第一
- 17. C长度不等的字符串,小写字母到大写字母
- 18. 混合字符串值的字母数字排序:字母数字字母
- 19. 按字母顺序排序字符串
- 20. 排序字符串按字母顺序
- 21. 按字母顺序排列字符串中的字母 - SAS
- 22. 在C++中将小写字母转换为大写字母
- 23. 计算大写字母,小写字母和其他字符
- 24. 排序字母在C中的排序
- 25. X86程序集将小写字母转换为大写字母
- 26. 排序字母
- 27. 如何小写字母转换为大写字母和大写字母为小写字母
- 28. C++,接受变量中的小写字母和大写字母
- 29. 在python中按字母排序字母表中的字母
- 30. C源代码将字符串中的第一个字母从小写字母改为大写字母
我建议使用['qsort'](https://msdn.microsoft.com/en-us/library/zes7xw0h.aspx)。 –
like [this](http://ideone.com/QEgiN0) – BLUEPIXY
字符串中是否包含字母以外的其他字符? – BLUEPIXY