鱼C论坛

 找回密码
 立即注册
查看: 4277|回复: 11

C语言使用指针使字符串数组排序问题

[复制链接]
发表于 2012-12-16 22:33:48 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 冷色画 于 2012-12-16 22:35 编辑

题目是输入三个字符串,按由小到大的顺序输出(用指针完成)

我编的程序按理论应该是没问题的啊,可是运行的时候是错误的,希望大家告诉我哪里错了,谢谢
  1. #include<stdio.h>
  2. #include<string.h> void input(char *x[],int n);     \\输入函数
  3. void sort(char *x[],int n);        \\排序函数
  4. void output(char *[],int n);     \\输出函数
  5. void main()
  6. {
  7.        char *p[3];
  8.        input(p,3);
  9.        sort(p,3);
  10.        output(p,3);
  11. }
  12. void input(char *x[],int n)
  13. {
  14.        int i;
  15.        for(i=0;i<n;i++)
  16.        gets(x+i);
  17. }void sort(char *x[],int n)
  18. {
  19.        int i,j;
  20.        int *t;
  21.        for(i=0;i<n-1;i++)
  22.            for(j=i+1;j<n;j++)
  23.           {
  24.                 if(strcmp(x[i],x[j])>0)
  25.                {
  26.                      t = x[i];
  27.                      x[i] = x[j];
  28.                      x[j] = t;
  29.                }
  30.           }
  31.   
  32. }
  33. void output(char *x[],int n)
  34. {
  35.        int i;
  36.        for(i=0;i<n;i++)
  37.        puts(x+i);
  38. }
  39.   
复制代码

最佳答案

查看完整内容

input()之前就加上 for( i = 0; i < 3; ++i ) { p = malloc( STR_MAXSIZE * sizeof(char) ); } output()后free掉, *p[N]的含义是含有N个指向char指针元素的数组, 每个char *都需要初始化的、
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-16 22:33:49 | 显示全部楼层
input()之前就加上
for( i = 0; i < 3; ++i )
{
     p[i] = malloc( STR_MAXSIZE * sizeof(char) );
}
output()后free掉,
*p[N]的含义是含有N个指向char指针元素的数组,
每个char *都需要初始化的、
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-16 22:36:45 | 显示全部楼层
第二行的void及后面的是换行的,没注意打错了,修改不了,大家将就着看吧,谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-17 08:03:08 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 10:37:37 | 显示全部楼层
说实话,我觉得你对字符串 还有数组和指针都不是很了解,建议有空详细看看。
首先数组就是指针
char *[]不是数组 而是数组指针 应该用char[]
其次 gets和puts函数都是读入输入流 遇到换行符(即回车)或eof(结束符)则停止读入
所以参数就是一个字符串指针(你可以说是字符数组) 不知道你为什么用for 反正你的很多逻辑都很奇怪。。
接着对于新手而言建议不要使用char p[3],用char p[100] 大一点。字符串结尾不是靠字符数组的大小决定的,而是字符是不是等于'\0'即0 决定的
比如char p[100]="abcde"
事实上是abcde\0
p的空间是100 但是实际上里面的字符串包含的字符只有5个
还有strcpm比较的是字符串 不是字符 你的用法错误
建议你再看看字符串和数组和指针,还有gets puts strcpm等函数的用法
以下是根据你的逻辑修改的
不严谨 但至少可以运行了 你可以看看

#include<stdio.h>
#include<string.h>
void input(char x[]);     //输入函数
void sort(char x[]);        //排序函数
void output(char []);      //输出函数

void main()
{

        char p[100];

        input(p);

        sort(p);

        output(p);

}

void input(char x[])
{
        gets(x);
}
void sort(char x[])
{

        int i,j;

        char t;

        for(i=0;x[i] != 0;i++)

                for(j=i+1;x[j]!=0;j++)

                {
                        if(x[i]-x[j]>0)

                        {

                                t = x[i];

                                x[i] = x[j];

                                x[j] = t;

                        }

                }

}

void output(char x[])
{
        puts(x);
}

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-17 11:11:19 | 显示全部楼层
EverLyn 发表于 2012-12-17 10:37
说实话,我觉得你对字符串 还有数组和指针都不是很了解,建议有空详细看看。
首先数组就是指针
char *[]不 ...

额。。。题目是要求用指针做,而且我定义的是char *p[3],是一个指针数组,存放了三个指针,用这三个指针指向三个字符串,再做比较,难道不对吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 14:12:53 | 显示全部楼层
好吧 我明白你的意思 不过我还有几点不太明白
首先先解释一下 为什么我要用char p[100]
因为你是从输入流中读入 你不知道读入多少个字符 所以char* p[3] 不能说是三个字符串 只能说是 三个字符 组成的数组 因为每个指针p[0],p[1],p[2] 他指向的具体空间大小未知 我采用的是动态分配内存的方式
       char *p[3];
       int i;
       for(i=0; i !=3; ++i)
        p[i] = (char*)malloc(sizeof(char)*100);
而strcmp函数 比较的是字符串的大小 比如asdfg,adefg,eirsd的结果是
adefg,asdfg,eirsd 每个字符串是不会改变的 不知道你是不是asdfg还要改成adfgs呢

因为是动态分配最后别忘了释放内存哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 14:25:21 | 显示全部楼层
突然发现二楼已经是正解了
我看来是多此一举了。。

评分

参与人数 1鱼币 +5 收起 理由
冷色画 + 5 不管怎么样,谢谢了

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 15:25:42 | 显示全部楼层
冷色画 发表于 2012-12-17 08:03
额。。。不好意思,能说的具体点吗,表示有点看不懂

简言之,char *p或者干脆这样,char *p = NULL;
这里的p能否直接用gets()呢?这么说lz能理解么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-21 10:15:05 | 显示全部楼层
suiyan 发表于 2012-12-17 15:25
简言之,char *p或者干脆这样,char *p = NULL;
这里的p能否直接用gets()呢?这么说lz能理解么?

题目做出来,请问是不是我错的地方是因为没有分配内存?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-21 22:13:53 | 显示全部楼层
冷色画 发表于 2012-12-21 10:15
题目做出来,请问是不是我错的地方是因为没有分配内存?

bingo!            。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-21 22:59:40 | 显示全部楼层
suiyan 发表于 2012-12-21 22:13
bingo!            。

知道了,谢啦哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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