字符串排序无法正常工作

时间:2016-02-15 14:51:25

标签: c

我制作了这个代码,假设按照一些规则对字符串进行排序,小字母首先来自a-z,大写字母后来来自A-Z,但它不能像我预期的那样工作。 (我知道问题来自于should_be_swapped函数,但我只是不明白为什么它不起作用。) 它所要做的就是将字符串“DBCAdbca”更改为新的字符串“abcdABCD”。

#include <stdio.h>

int should_be_swapped(char ch1,char ch2);
void swap_chars(char* ch1, char* ch2);
int sort_string(char* str);

int main()
{
    char a[]="DCBAdcba";
    if (sort_string(a))
    {
        printf("Sorted String: %s\n", a);
    }
    else
    {
        printf("The original String was already sorted.\n");
    }
    return 0;
}

int should_be_swapped(char ch1,char ch2)
{
    if (ch1<ch2)
    {
        return 1;
    }
    if (ch1>ch2 && ch1<='z'&& ch1>='a' && ch2<='z'&&ch2>='a')
    {
        return 1;
    }
    if (ch1>ch2 && ch1<='Z'&& ch1>='A' && ch2<='Z'&&ch2>='A')
    {
        return 1;
    }
    else {
        return 0;
    }
}

void swap_chars(char* ch1, char* ch2)
{
    char tmp;
    tmp = *ch1;
    *ch1 = *ch2;
    *ch2 = tmp;
}

int sort_string(char* str)
{
    int i,j,count=0;

        for (j=0;str[j]!='\0';j++)
        {
            for (i=0;(str[i])!='\0';i++)
            {
                if (should_be_swapped(str[i],str[i+1])  )
                {
                swap_chars(&str[i],&str[i+1]);
                count++;
                }
            }
        }

    if (count>0)
        {
        return 1;
        }
    else {
        return 0;
    }
}

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

int should_be_swapped(char ch1, char ch2)
{
    if (ch1<ch2 && ch1 <= 'Z'&& ch1 >= 'A' && ch2 <= 'z'&&ch2 >= 'a')
    {
        return 1;
    }
    if (ch1>ch2 && ch1 <= 'z'&& ch1 >= 'a' && ch2 <= 'z'&&ch2 >= 'a')
    {
        return 1;
    }
    if (ch1>ch2 && ch1 <= 'Z'&& ch1 >= 'A' && ch2 <= 'Z'&&ch2 >= 'A')
    {
        return 1;
    }
    else { return 0; }
}

您没有考虑到CAPS的ascii值低于小写。这似乎产生了预期的结果。

答案 1 :(得分:0)

你的意思是这样做吗?

int should_be_swapped(char ch1,char ch2){
    if (ch1<='Z' && ch1>='A' && ch2<='z' && ch2>='a'){
        return 1;
    }else if (ch1<='z' && ch1>='a' && ch2<='Z' && ch2>='A'){
        return 0;
    }else if (ch1>ch2){
        return 1;
    }else{
        return 0;
    }
}

答案 2 :(得分:0)

我将假设您可以使用大于对char类型的检查,并且还假设问题是您得到的答案看起来像ABCDabcd而不是abcdABCD。对于ASCII字符,它们被计算机称为整数,即'a'是97而'A'是65,所以当你问计算机是'a'时,它是'答案'答案是否定的,因为它正在比较它与每个字符关联的整数值,而不是它们的字母顺序。

尝试使用此表(http://www.asciitable.com/)并在比较时将字符视为整数。

答案 3 :(得分:0)

这是我的解决方案。它首先检查值是否在违规范围内并修复它们,如果值在a-z内,它将转换为A-Z,反之亦然。然后,它使用单个if语句来比较新值,但旧值将被交换。

int should_be_swapped(char ch1,char ch2)
{
    const char cn1 = ( ch1<='z'&& ch1>='a' ) ? ch1 - ( 'A' - 'a' ) : ch1 ;
    const char c1 = ( ch1<='Z'&& ch1>='A' ) ? ch1 + ( 'A' - 'a' ) : cn1 ;

    const char cn2 = ( ch2<='z'&& ch2>='a' ) ? ch2 - ( 'A' - 'a' ) : ch2 ;
    const char c2 = ( ch2<='Z'&& ch2>='A' ) ? ch2 + ( 'A' - 'a' ) : cn2 ;

    if( c1 > c2 )
    {
        return 1 ;
    }

    return 0 ;
}

在代码中使用此函数会得到正确的结果: abcdABCD