鱼C论坛

 找回密码
 立即注册
查看: 1685|回复: 3

一道指针数组问题 求解答 (字符串排序)

[复制链接]
发表于 2016-4-18 18:15:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
int main()
{
        int n,i;
        char a[101][101],*p[101];
        void s(char*p[],int n);
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%s",a[i]);
        p[i]=a[i];
        }
        s(p,n);
        for(i=0;i<n;i++)
                printf("%s\n",p[i]);
        return 0;
}
void s(char *p1[],int n)
{
        int j,k;
        char *t;
        for(j=0;j<n-1;j++)
                for(k=j+1;k<n;k++)
                        if(strcmp(p1[j],p1[k])>0)
                        {
                                t=p1[j];
                                p1[j]=p1[k];
                                p1[k]=t;
                        }
}
上面是正确做法
下面是错误做法

#include<stdio.h>
#include<string.h>
int main()
{
        int n,i;
        char a[101][101],*p[101];
        void s(char*p[],int n);
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%s",a[i]);
        p[i]=a[i];
        }
        s(p,n);
        for(i=0;i<n;i++)
                printf("%s\n",*p[i]);
        return 0;
}
void s(char *p1[],int n)
{
        int j,k;
        char t;
        for(j=0;j<n-1;j++)
                for(k=j+1;k<n;k++)
                        if(strcmp(p1[j],p1[k])>0)
                        {
                                t=*p1[j];
                                *p1[j]=*p1[k];
                                *p1[k]=t;
                        }
}

为什么输出我改成输出*p【i】就不行了?  而p[i]不是代表地址吗?
题目如下  字符串排序
Sample Input
5
red
blue
yellow
green
purple

Sample Output
blue
green
purple
red
yellow
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-19 00:19:25 | 显示全部楼层
本帖最后由 mingcxx 于 2016-4-19 00:23 编辑

p:是第i个字符串的地址,也是指向第i个字符串首字符的指针(地址)
*p: 取值运算符取出第i个字符串的首字符。
printf("%s", p); 表示从p指向的字符开始依次向后打印每个字符,直到遇到空字符为止。所以,打印字符串实际上是在传递字符串的地址(或者更准确说是字符串首元素的地址),函数本身自动打印该字符到第一个空字符之间的所有字符,也就是打印了所谓的字符串。
printf("%s", *p);语法错误,打印字符串需要传递字符串地址p,而不是字符串首字符*p。编译器不检查printf()的参数错误,调试运行一定有内存访问报错。
再说字符串排序:对指向字符串的指针排序。
排序代码部分:
 t=*p1[j];
 *p1[j]=*p1[k];
 *p1[k]=t;
错,多了*号之后,原本交换指针值变成了交换对应字符串的首元素。假定没有其他编程错误,
调试运行:发现每个字符串的首元素都变成了其他字符串的首元素按序排列。
建议巩固基础。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-4-19 03:05:55 | 显示全部楼层
过来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-19 03:09:48 | 显示全部楼层
过来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表