标题:刚写了一个用冒泡排序排按字母表顺序整理字符串,遇到些问题求教
只看楼主
attentive
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-3-3
结帖率:0
已结贴  问题点数:20 回复次数:8 
刚写了一个用冒泡排序排按字母表顺序整理字符串,遇到些问题求教
我想依据asc2中字母值大小做冒泡排序,给录入的字符串重按字母表顺序排序,结果打印出一行烫烫烫烫
请问问题出在哪里?

#include<stdio.h>

main()
{
    char initial[30] , t;
    int outer, inner,didchange = 0;
    puts("please write less than 30 letters\n");
    gets(initial);
    /* mao pao pai xu */
    for(outer = 0;outer < (sizeof(initial)-1); outer++)
    {
        for(inner = outer; inner < sizeof(initial); inner++)
        {
            if( initial[outer] > initial[inner])
            {
                t = initial[outer];
                initial[outer] = initial[inner];
                initial[inner] = t;
                didchange=1;
            }
        }
        if(didchange = 0)/* ti qian jie su*/
        {break;}
    }
    initial[(sizeof(initial)+1)] = "\0";
   
        printf("%s",initial);
}
搜索更多相关主题的帖子: include initial letters please 字母表 
2015-03-03 12:23
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:5 
你必须以输入的字符串实际长度作为参考排序,不能以数组长度做参考的。这一句“initial[(sizeof(initial)+1)] = "\0"”应该不能通过编译。
vc6里未初始化的字符数组值一般为-52,两个-52是汉字“烫”的内码,你对整个数组排序,-52肯定最小,当然排在前面,第二小的就是0,这会当做字符串结束符,所以最后你就只显示“烫”字了,显示的个数=30-你输入的字符数(不是偶数还要少一个)。

[ 本帖最后由 wmf2014 于 2015-3-3 13:42 编辑 ]

能编个毛线衣吗?
2015-03-03 13:40
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
得分:5 
程序问题太大了哦

我不是砖家,要努力成为砖家。
2015-03-03 13:46
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:5 
字符串比较为什么不直接用strcmp函数

一片落叶掉进了回忆的流年。
2015-03-03 15:00
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:5 
楼主的意图貌似 是以下代码  (现在的同学啊  发帖一律要靠猜)

# include <stdio.h>

int main(void)
{
    char test[]="This is a test text.";
    int ln=0;
    while(test[ln]!='\0') ln++;
    int i,j;
    char t;
    for(i=0;i<ln;i++)
    {
        for(j=i;j<ln;j++)
        {
            if(test[i]>test[j])
            {
                t=test[j];
                test[j]=test[i];
                test[i]=t;
            }
        }
    }
    printf("%s\n",test);
    return 0;
}

DO IT YOURSELF !
2015-03-04 08:51
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
对楼主的代码不需要改动太大即可,代码如下:
#include<stdio.h>

main()
{
    char initial[30] , t;
    int outer, inner,didchange = 0;
    puts("please write less than 30 letters\n");
    gets(initial);
    /* mao pao pai xu */
    for(outer = 0;initial[outer+1]!=0; outer++)
    {
        for(inner = outer+1; initial[inner]!=0; inner++)
        {
            if( initial[outer] > initial[inner])
            {
                t = initial[outer];
                initial[outer] = initial[inner];
                initial[inner] = t;
                didchange=1;
            }
        }
        if(didchange = 0)/* ti qian jie su,这一句有问题,应该==。不过幸亏语句错误,否则算法错误,无法正常排序*/
        {break;}
    }
    //initial[(sizeof(initial)+1)] = "\0";
   
        printf("%s\n",initial);
}

[ 本帖最后由 wmf2014 于 2015-3-4 09:37 编辑 ]
收到的鲜花
  • attentive2015-03-15 19:05 送鲜花  1朵   附言:我很赞同,我在楼下回复了您,并提出一个建议 ...

能编个毛线衣吗?
2015-03-04 09:32
attentive
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-3-3
得分:0 
回复 2楼 wmf2014
嗯嗯,最近课太多忘了这个问题了,原谅我
sizeof确实返回定义的数组占内存字节数。我现在想是不是要用strlen()求字符串实际长度。
非常感谢,帮了我大忙!
2015-03-11 22:51
attentive
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-3-3
得分:0 
回复 2楼 wmf2014
initial[(sizeof(initial)+1)] = "\0"这一句确实问题很大嗯
2015-03-11 23:09
attentive
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-3-3
得分:0 
回复 6楼 wmf2014
您对字符串比较的结束条件的语句给我很大启发,十分感谢,第一次发帖就有您这样的高手帮我,我感到真幸福!!
还有个小疑问for(outer = 0;initial[outer+1]!=0; outer++)这句outer的变化为initial[1]initial[3]initial[5]会有跳过吧?去掉+1也可顺利结束是不是
2015-03-11 23:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442339-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.088893 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved