| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1597 人关注过本帖
标题:对6个字符串由大到小排序,输出不对
只看楼主 加入收藏
B_soldier
Rank: 2
等 级:论坛游民
帖 子:38
专家分:41
注 册:2016-10-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
对6个字符串由大到小排序,输出不对
#include<stdio.h>                            //输入6个字符串,有小到大排序输出
#include<string.h>
int main(){
    int i, j, min;
    char s[6][80]={0}, str[80]={0};          //二维字符串数组存储
   
    printf("Enter 6 strings:\n");
    for(i=0; i<6; i++)
        gets(s[i]);                          //输入字符串,
   
    for(i=0; i<5; i++){
        min=i;         
        for(j=i+1; j<6; j++)                 //选择排序     
            if(strcmp(s[min],s[j])>0)
                min=j;
        if(i!=min){                          //交换字符串位置
            strcpy(str, s[i]);
            strcpy(s[i], s[j]);
            strcpy(s[j], str);
        }
    }
   
    for(i=0; i<6; i++)
        puts(s[i]);
        
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: include 字符串 Enter 
2016-12-27 21:15
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这里~


        if(i!=min)
        {                          //交换字符串位置
            strcpy(str, s[i]);
            strcpy(s[i], s[min]);
            strcpy(s[min], str);
        }

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-27 21:36
B_soldier
Rank: 2
等 级:论坛游民
帖 子:38
专家分:41
注 册:2016-10-20
收藏
得分:0 
回复 2楼 九转星河
我也觉得这个位置好像有点问题,是不是每次都要对str[]数组初始化一下啊,,,另外puts函数输出字符串不是遇到'\0'就结束了吗,为什么会输出这些乱码呢?
2016-12-27 21:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:15 
strcpy遇到0就结束复制,同时会在copy的尾部补0,strcmp遇到0位则不再进行比较,如果不是按数组扫描字符的形式扫描的话……没啥影响

出现乱码其实是逻辑问题,因为j的值已经指向末尾了~j!=min---j=6~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-27 21:55
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
你的选择排序思维混乱

#include<stdio.h>                            //输入6个字符串,有小到大排序输出
#include<string.h>
int main()
{
    int i, j, min;
    char s[6][80]={0}, str[80]={0};          //二维字符串数组存储
    printf("Enter 6 strings:\n");
    for(i=0; i<6; i++)     gets(s[i]);       //输入字符串,
    for(i=0; i<6; i++)
 {
  min=i;         
  for(j=i+1; j<6; j++)  
   if(strcmp(s[min],s[j])>0)
   {
    strcpy(str, s[j]);
    strcpy(s[j], s[min]);
    strcpy(s[min], str);
   }
 }
 printf("==================\n");
 for(i=0; i<6; i++)   puts(s[i]);
 return 0;
}

DO IT YOURSELF !
2016-12-27 21:59
B_soldier
Rank: 2
等 级:论坛游民
帖 子:38
专家分:41
注 册:2016-10-20
收藏
得分:0 
回复 5楼 wp231957
我那个选择排序算法是书上的,每次找到最小值然后跟第一个字符串交换一次,这样总共程序最多只交换五次,,,你这样写是每遇到小数组就交换一次,交换的次数要更多些,,,不过好像你这个程序就没问题了,我还挺纳闷的
2016-12-28 09:30
see235959850
Rank: 2
等 级:论坛游民
帖 子:380
专家分:29
注 册:2016-12-21
收藏
得分:0 
学习了
2016-12-28 09:34
B_soldier
Rank: 2
等 级:论坛游民
帖 子:38
专家分:41
注 册:2016-10-20
收藏
得分:0 
回复 4楼 九转星河
不愧为版主对的,我要交换的是s[i]跟s[min]的位置,我给写成了交换是s[i]跟s[j],循环过后的j已经等于6,越界了才会出现乱码,懂了

        if(i!=min){                          //交换字符串位置
            strcpy(str, s[i]);
            strcpy(s[i], s[min]);
            strcpy(s[min], str);
        }
   
2016-12-28 09:45
快速回复:对6个字符串由大到小排序,输出不对
数据加载中...
 
   



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

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