| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 903 人关注过本帖
标题:五个字符串排序,运行不了,请帮看一下,问题在哪里?
只看楼主 加入收藏
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
五个字符串排序,运行不了,请帮看一下,问题在哪里?
代码如下:
#include <stdio.h>
#include<string.h>
void main()
{
    char *a[5]={"qw","we","rt","yu","io"};
    char **p,**q,**x;
   
    for(p=a;p<=p+3;p++)
        for(q=p+1;q<=p+4;q++)
            if(strcmp(*p,*q)>0)
            {
                *x=*p;
                *p=*q;
                *q=*x;            
            }
    for(int i=0;i<=4;i++)printf("%s\n",*(p+i));
}
搜索更多相关主题的帖子: include 字符串 
2014-02-15 11:49
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 楼主 zhu_zhi
for(int i=0;i<=4;i++). c里面不能这么写,C++可以。

想抽苏烟了。
2014-02-15 12:42
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
1、楼主这段代码估计本就是个.cpp文件(void main多见于微软编译器下的代码里)

2、在C99标准里for(int i;..)也是合法的

3、楼主的问题是个逻辑错误。p <= p + 3,这在多会儿都是为真的。

重剑无锋,大巧不工
2014-02-15 13:05
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 3楼 beyondyf
你的意思是把p<=p+3 换成p<=a+3 ?但是还是Segmentation fault 求大神详细讲解,指针也是我的薄弱环节。。

想抽苏烟了。
2014-02-15 20:00
mhy9345ddy2
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2013-12-15
收藏
得分:0 
你这明显是学指针学晕了,把一个简单的问题搞这么复杂
    int n=5,i,j;
    char *a[5]={"qw","we","rt","yu","io"};
    char *tmp;
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(strcmp(a[i],a[j])>0)
            {
                tmp=a[i];
                a[i]=a[j];
                a[j]=tmp;
            }
    for(i=0;i<=4;i++)printf("%s\n",a[i]);

[ 本帖最后由 mhy9345ddy2 于 2014-2-15 21:32 编辑 ]
2014-02-15 21:30
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
回复 4楼 fl8962
先跟楼上说一下,这不是复杂不复杂的问题,我想楼主就是想通过这个问题练习一下指针的使用。你这个改法就失去了它原有的意义。

再回复4楼。楼的代码存在以下几处逻辑错误。

1、两个循环的迭代条件不对。应改成 p<=a+3; q<=a+4;

2、变量x的使用不对。看代码可知楼主打算用选择排序来排这a,x是个中间变量用来在交换变量值时作临时存储用。它要是个实体才能存储,而不该是指针。(注意,这里我说的实体是一级指针,而指针则是二级指针)。所以这里x应该声明为一级指针。如果非要使用二级指针,那么需要在使用前先指向一个一级指针。

3、在输出的时候p的指向位置并没有复位到a,却要向后输入5位,这必然也会造成溢出。

下面我在尽量保持原代码逻辑的情况对错误之处进行修改。

第一段x使用一级指针
程序代码:
#include <stdio.h>
#include <string.h>

void main()
{
    char *a[5] = {"qw","we","rt","yu","io"};
    char **p, **q, *x;

    for(p = a;p <= a + 3; p++)
        for(q = p + 1; q <= a + 4; q++)
            if(strcmp(*p, *q) > 0)
            {
                x = *p;
                *p = *q;
                *q = x;            
            }
        p = a;
    for(int i=0;i<=4;i++)printf("%s\n",*(p+i));
}

第二段x使用二级指针
程序代码:
#include <stdio.h>
#include <string.h>

void main()
{
    char *a[5] = {"qw","we","rt","yu","io"};
    char **p, **q, **x, *t;

    x = &t;
    for(p = a;p <= a + 3; p++)
        for(q = p + 1; q <= a + 4; q++)
            if(strcmp(*p, *q) > 0)
            {
                *x = *p;
                *p = *q;
                *q = *x;            
            }
        p = a;
    for(int i=0;i<=4;i++)printf("%s\n",*(p+i));
}

而真正简单的写法该是这样的
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void * a, const void * b)
{
    return strcmp(*(char **)a, *(char **)b);
}

void main()
{
    char *a[] = {"qw", "we", "rt", "yu", "io"};
    qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), cmp);
    for(int i = 0; i <= 4; i++) printf("%s\n", a[i]);
}

重剑无锋,大巧不工
2014-02-15 22:22
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
收藏
得分:0 
回复 5楼 mhy9345ddy2
谢谢!
但不是指针的指针法,不符合题意。
2014-02-15 22:43
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
收藏
得分:0 
回复 6楼 beyondyf
楼主真是高啊!实在是高。
分析我原来代码的错误很到位,谢谢!
看你的分析,有两个收获:
1、知道错误所在,不应以**p为循环的上下限,因为**p是不断变化的,而是应该以数组a参照物。
2、因为错用**x,第一次知道实体和二级指针的区别,虽然现在还不是很明白。
再次感谢楼主!
2014-02-15 23:10
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
乱用词语   楼主是你自已好不

DO IT YOURSELF !
2014-02-16 08:47
zhu_zhi
Rank: 2
来 自:广西百色
等 级:论坛游民
帖 子:129
专家分:92
注 册:2013-4-25
收藏
得分:0 
回复 9楼 wp231957
不好意思,这也错。谢谢指正!
2014-02-16 14:43
快速回复:五个字符串排序,运行不了,请帮看一下,问题在哪里?
数据加载中...
 
   



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

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