我在C中排序字符时遇到了一些问题。如果我想按字母顺序从z到a对数组进行排序,它的工作正常。当我尝试相反时,从a到z,它不起作用..我可以使用一些帮助,谢谢;)
#include <stdio.h>
#include <string.h>
int main () {
char s1[10],a;
int i,t;
printf("enter a set to sort: ");
scanf("%s",s1);
t=1;
// printf("%d length of set",strlen(s1));
while (t==1)
{
// printf("a\n");
t=0;
for (i=0;i<strlen(s1);i++)
{
if (s1[i]<s1[i+1])
{
// printf("s");
t=1;
a=s1[i+1];
s1[i+1]=s1[i];
s1[i]=a;
}
}
}
printf("%s sorted",s1);
}
答案 0 :(得分:1)
这是一个很大的问题:
if (s1[i]<s1[i+1])
这会将字符串中的最后一个字符与字符串终止符进行比较。因此,您将对字符串进行排序,包括字符串终止符,这不是您想要的。
答案 1 :(得分:0)
如果您只使用1个循环,则不会对所有组合进行排序。所以使用bubble排序逻辑。
while (t==1)
{
// printf("a\n");
t=0;
for (i=0;i<strlen(s1)-1;i++)
{
for(j=0;j<strlen(s1)-1-i;j++)
{
if (s1[j]<s1[j+1])
{
// printf("s");
t=1;
a=s1[j+1];
s1[j+1]=s1[j];
s1[j]=a;
}
}
}
}
答案 2 :(得分:0)
仅供参考,在C中执行此操作的理想方法是:
#include <stdlib.h> // qsort
#include <ctype.h> // toupper
#include <stdio.h> // printing
int chrcmp (const void* obj1, const void* obj2)
{
char ch1 = *(const char*)obj1;
char ch2 = *(const char*)obj2;
ch1 = toupper(ch1); // remove case-sensitivity
ch2 = toupper(ch2);
return ch1 - ch2; // integer promotion will make this int implicitly
}
int main()
{
char str[] = "Sort letters and symbols alphabetically";
puts(str);
qsort (str, // the array to sort
sizeof(str)-1, // the number of items in the array (minus nullterm)
sizeof(char), // the size of each item
chrcmp); // comparison function
puts(str);
return 0;
}
输出:
Sort letters and symbols alphabetically
aaaabbcdeeehilllllmnooprrSsssttttyy