zcmerlin
zcmerlin
2016-09-03 14:23
采纳率: 70%
浏览 1.5k
已采纳

C语言,请教字符串排序问题

输入一个字符串,然后一分为二,左边部分按ASCII的值降序排列,右边部分按ASCII的值升序排列,如果字符串长度为奇数,则中间一个数不参与排序,扔置于原位置。
例如:
输入1234dcba
输出4321abcd
然而我写代码输出的结果是乱码..如图图片说明

以下是我的代码

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

void down_sort(char *string, int mid);   //函数声明:分别降序排列,升序排列,输出
void up_sort(char *string, int mid);
int putout(char *string);

int main()
{
    char str[81];                      
    int middle = 0, middle_l, middle_r;    //定义中点,字符串分两部分,middle_l为左半部分所用中点,middle_r为右半部分所用中点

    gets(str);

    if (strlen(str) % 2 != 0)
    {
        middle = (strlen(str) + 1) / 2;   //对中点取值
        middle_l = middle - 1;            //对middle_l取值
        middle_r = middle + 1;            //对middle_r取值
    }
    else
    {
        middle = strlen(str) / 2;         //同上
        middle_l = middle;
        middle_r = middle + 1;      
    }

    down_sort(str, middle_l);             //对左半部分降序排列
    up_sort(str, middle_r);               //对右半部分降序排列
    putout(str);                          //输出结果

    system("pause");
    return 0;
}

void down_sort(char *string, int mid)         //冒泡降序排列
{
    int end, num, tmp;
    for (end = 0; end < (mid - 1); end++)
    {
        for (num = 0; num < mid - 1 - end; num++)
        {
            if (string[num] < string[num + 1])
            {
                tmp = string[num];
                string[num] = string[num + 1];
                string[num + 1] = tmp;
            }
        }
    }
}

void up_sort(char *string, int mid)          //冒泡降序排列
{
    int end, middle, num, tmp;
    for (end = mid; end < strlen(string); end++)
    {
        for (num = mid; num < strlen(string) - 1 - end; num++)
        {
            if (string[num] > string[num + 1])
            {
                tmp = string[num];
                string[num] = string[num + 1];
                string[num + 1] = tmp;
            }
        }
    }
}

int putout(char *string)
{
    int i;
    for (i = 0; i < strlen(string); i++)
    {
        printf("%c", string + i);
    }
    printf("\n");
    return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • Wang_1997
    嘻嘻兮 2016-09-03 15:19
    已采纳

    又遇见你啦,缘分!我帮你看了下题目。我把一些注意的写在代码里了。

     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void down_sort(char *string, int mid);   //函数声明:分别降序排列,升序排列,输出
    void up_sort(char *string, int mid);
    int putout(char *string);
    
    int main()
    {
        char str[81];                      
        int middle = 0, middle_l, middle_r;    //定义中点,字符串分两部分,middle_l为左半部分所用中点,middle_r为右半部分所用中点
    
        gets(str);
        //这里我发现你的 middle,middle_l还有r都是从下标1开始计数的,
        //但是数组下标从0开始,所以这样子很容易造成混乱。你下面的down就混乱了 
        //但是也是可以的,只不过不细心就很容易出错 
        middle = strlen(str) / 2;   //对中点取值
        middle_l = middle - 1;            //对middle_l取值
        if (strlen(str) % 2 != 0)
        {         
            middle_r = middle + 1;            //对middle_r取值
        }
        else
        {
            middle_r = middle;      
        }
        down_sort(str, middle_l);             //对左半部分降序排列
        up_sort(str, middle_r);               //对右半部分降序排列
        putout(str);                          //输出结果
    
        system("pause");
        return 0;
    }
    //因为上面的修改对以下冒泡做了点小改动 
    void down_sort(char *string, int mid)         //冒泡降序排列
    {
        int end, num, tmp;
        for (end = 0; end < mid ; end++)
        {
            for (num = 0; num < mid - end; num++)
            {
                if (string[num] < string[num + 1])
                {
                    tmp = string[num];
                    string[num] = string[num + 1];
                    string[num + 1] = tmp;
                }
            }
        }
    }
    
    void up_sort(char *string, int mid)          //冒泡降序排列
    {
        int end, middle, num, tmp ;
        for (end = mid; end < strlen(string); end++)
        {    //这里需要加上mid,因为你想想看len-1-end肯定比num小了,所以永远不会进去 
            //所以你会发现修改了乱码后你的程序后面部分是没排序的,但是这样就ok了 
            for (num = mid; num < strlen(string) -1 - end + mid; num++)
            {
                if (string[num] > string[num + 1])
                {
                    tmp = string[num];
                    string[num] = string[num + 1];
                    string[num + 1] = tmp;
                }
            }
        }
    }
    
    int putout(char *string)
    {
        int i;
        for (i = 0; i < strlen(string); i++)
        {
            //乱码的主要问题是在这里你直接+i是地址,需对其取值 
            printf("%c", *(string+i));
        }
        printf("\n");
        return 0;
    }
    

    上面的程序经过测试无问题了,兄台在哪个OJ上玩呀!!

    点赞 评论
  • baisedeqingting
    wjsay 2016-09-03 14:34

    你忘了加*号,string+i是地址,而你用的%c,所以要加*
    printf("%c", *(string + i));

    点赞 评论

相关推荐