鱼C论坛

 找回密码
 立即注册
查看: 11644|回复: 25

指针数组如何赋值?

[复制链接]
发表于 2015-3-16 23:32:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 haiouda 于 2015-3-17 13:09 编辑
/***********************************

  输入3个字符串,按由小到大的顺序输出
  
        
**************************************/

#include <stdio.h>
#include <string.h>

int main()
{
        char *p[3],a0[20],a1[20],a2[20];
        void p1(char *m[],int n);
        void print(char *w[],int n);
        int i,n=3;        
        printf("请输入 3 个字符串:");
        scanf("%s",a0);
        scanf("%s",a1);
        scanf("%s",a2);
        printf("\n");
        
        for (i=0;i<3;i++)
        {
                switch (i)
                {
                case 0:        p[i]=a0;break;
                        
                case 1:        p[i]=a1;break;
                        
                case 2:        p[i]=a2;
                        
                }
                
        }
    
        print (p,3);
    printf("\n");
        
        p1(p,3);
        
        
        print (p,3);
    printf("\n");
        
        
        return 0;
        
}


void p1(char *m[],int n)
{
        char *temp;
        int i,j,k;
        for (i=0;i<n-1;i++)
        {
                k=i;
                for(j=i+1;j<n;j++)
                        if(strcmp(m[k],m[j])>0)
                        {
                                k=j;
                        }
                        if(k!=i)
                        {
                                temp=m[i]; m[i]=m[k];m[k]=temp;
                        }
        }
        
}




void print(char *w[],int n)
{
        int i;
        for (i=0;i<n;i++)
        {
                printf("%s ",w[i]);
        }
        
        printf("\n");
        
        
}

这是书上课后题,越写感觉越麻烦;有没有简单的呀,帮我改改程序,谢谢了
我的问题是,指针数组在定义时没有赋值,就象上面那样子,然后,怎么给它赋值最简单呀(我是用了用了3个数组作中转,这是要求输入3个字串,要是要求输入1000个了串,还不得定义1000个数组了,麻烦死了)。







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-17 02:12:44 | 显示全部楼层

回帖奖励 +1 鱼币

你这样写不行吧, 定义了三个指针, 没有指向, 你直接指定地址, 会出错的吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-17 13:20:29 | 显示全部楼层
求指点迷津  {:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-17 22:00:54 | 显示全部楼层

回帖奖励 +1 鱼币

首先要明白指针存放的是一个地址
一般情况下是先给一个变量赋值,然后再让指针指向这个变量
但是在楼主你所遇到的这个问题中,直接给指针赋值为什么不行呢,还是第一句话,
当从控制台赋值时,那个变量在电脑内存中并没有赋予地址,所以此时用指针的话被没有一个实际的地址给指针,所以出现错误

不知楼主听懂了没
一句话就是指针存放的是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-18 08:36:06 | 显示全部楼层
上面的程序能改简单些么? 还是那个问题,要输入1000个字串,真的要准备1000个变量?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 21:14:23 | 显示全部楼层

回帖奖励 +1 鱼币

用c++来写比较简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 21:58:24 | 显示全部楼层

回帖奖励 +1 鱼币

想问楼主问题到底是怎样的,是按三个字符串的大小 排序,还是把三个字符串里的每个字母都拿出来放到一起排序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-18 22:09:45 | 显示全部楼层
lightninng 发表于 2015-3-18 21:58
想问楼主问题到底是怎样的,是按三个字符串的大小 排序,还是把三个字符串里的每个字母都拿出来放到一起排 ...

我的问题是,把现有的题改成:“输入1000个字符串,然后按由小到大的顺序输出” 的程序应该如何时来写,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 22:29:43 | 显示全部楼层
c语言好久没看了,字符数组相关知识记的不是很清楚用文字描述代替,见谅
定义字符数组 s1[1024]和s2[1024],
int seq[1000] #整形数组记录大小顺序
for(i = 1, i <=1000, i++)seq[i]=i;
#用冒泡排序法
for(i = 999, i >= 0,i--)
{
        for(j = 0,j < i,j++)
        {
                把第j个字符串赋值给s1
                把第j+1个字符串赋值给s2
                比较两者大小
                如果s1>s2
                交换seq[j]和seq[j+1]
        }
}
按照seq数组中保存的顺序输出字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 00:09:04 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 00:39 编辑
lightninng 发表于 2015-3-18 22:29
c语言好久没看了,字符数组相关知识记的不是很清楚用文字描述代替,见谅

谢谢,你这个,没有动态输入字符串常量的过程;能补上这个过程么?

还有,你这里 char seq(1000); 这是定义长度为1000个‘字符’的一个字符串,也不是我要的1000个‘字符串常量’
*************************************************************************************************************
'c' 这个是字符常量       “cc”这个是字符串常量
我要的是后者1000个,动态(程序运行时输入),然后比较它们大小,再按从小到大的顺序输出。


题目:输入1000个字符串,按由小到大的顺序输出

当然1000个可能是多了点,要能设计出输入30或者50的也行,必竟改一下数字就是1000个了{:1_1:}
我最上面的,方法可见是不行的,我要,求取的是:思路方法和关键的语句。

*******************************************************************************************************************
#include <stdio.h>

int main()
{
char *p[30];
p[0]="China";
p[1]="man";
printf("%s %s\n",p[0],p[1]);
#endif;
}
上面这段程序,定义了30个指针组成的,指针数组,前二个指针指向了字符串,还有28个指针没有指向字符串,如何实现动态输入28个字符串,让其它的指针,指向输入的28个字符串;这个就是我要,求教的问题,谢谢。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-19 08:54:51 | 显示全部楼层
char *p[30],str[20];
for(i = 0, i <30, i++)
{
        scanf("%s",str);
        p[i] = str;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 08:56:58 | 显示全部楼层

你这个,只能输入相同的字符串!而且是最后的那个字符串,因为所有字符串的地址相同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-19 08:59:24 | 显示全部楼层
haiouda 发表于 2015-3-19 08:56
你这个,只能输入相同的字符串!而且是最后的那个字符串,因为所有字符串的地址相同。

恩。。刚想了好像确实不对。正想上来改~~
主要是新的字符串必须得有新的地址,那就得先给它申请好地址,直接用一个二元数组不好么。。。
这样的char str[30][20]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 09:02:30 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 09:03 编辑
lightninng 发表于 2015-3-19 08:59
恩。。刚想了好像确实不对。正想上来改~~
主要是新的字符串必须得有新的地址,那就得先给它申请好地址, ...

可以的,这是个好方法,谢谢
可具体怎么实现?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 09:06:50 | 显示全部楼层
lightninng 发表于 2015-3-19 08:59
恩。。刚想了好像确实不对。正想上来改~~
主要是新的字符串必须得有新的地址,那就得先给它申请好地址, ...

是不是要用个三维数组才能实现? 即然是数组,那就得先声明行 和列,这样就对输入有了限制(输入字符串不能长于声明)……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-19 09:10:36 | 显示全部楼层
本帖最后由 lightninng 于 2015-3-19 09:12 编辑
haiouda 发表于 2015-3-19 09:02
可以的,这是个好方法,谢谢
可具体怎么实现?

好久没碰c,现在机器 上只有python,写出代码来也不知道对不对[i][i]
char str[30][20];
int i;
for(i = 0, i <30, i++)
        scanf("%s",str[i]);

[/i][/i]
[i][i]应该就表示第i个字符串的首地址,但是语言中字符数组和符串似乎略有不同
另外:楼主,别说了了思路你倒是自己先敲点代码试一下啊,等别人的代码还不如自己来~~
[/i][/i]

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-19 09:13:51 | 显示全部楼层
haiouda 发表于 2015-3-19 09:06
是不是要用个三维数组才能实现? 即然是数组,那就得先声明行 和列,这样就对输入有了限制(输入字符串不 ...

请自行参考字符数组相关知识,这个好一点的书都有,你也可以百度,字符数组挺麻烦的,和字符串似乎略有不同~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 09:14:55 | 显示全部楼层
lightninng 发表于 2015-3-19 09:13
请自行参考字符数组相关知识,这个好一点的书都有,你也可以百度,字符数组挺麻烦的,和字符串似乎略有不 ...

多谢 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 14:42:47 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 14:49 编辑
lightninng 发表于 2015-3-19 09:13
请自行参考字符数组相关知识,这个好一点的书都有,你也可以百度,字符数组挺麻烦的,和字符串似乎略有不 ...

这个的缺点是:1)不输入1000个字串不能退出(这个可以自己解决);    2)输入的字符串长度,最长为29个字符(由二维数组确定),输入不够浪费空间,输入超了无效;
                    第二个问题哪位能指点下怎么修改,谢谢:handshake
#include <stdio.h>
#include <string.h>
#define xx 1000
int main()
{
        void pxx(char *b[],int n);
        int i;
        char p[xx][30],*a[xx];
        
        for (i=0;i<xx;i++)
        {
                a[i]=p[i];
        scanf("%s",a[i]);
        }
   
   pxx(a,xx);



        for (i=0;i<xx;i++)
        {
        printf("%s ",a[i]);
                
        }
        printf("\n");

 return 0;

}

void pxx(char *b[],int n)
{
        int i,k;
        char *temp;
        for (i=n;i>0;i--)
        {
                for(k=0;k<i-1;k++)
                if(strcmp(b[k],b[k+1])>0)
                {
                        temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;

                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-19 22:00:16 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 22:02 编辑
<p><p>#include <stdio.h>
#include <string.h>
#define xx 1000
int main()
{
        void pxx(char *b[],int n);    //声明函数 用于从小到大排列数组
        int i,k;
        char p[xx][30],*a[xx];

        printf("请输入字符串,按下回车表示一个字符串输入完毕,连续按三次回车表示所有字符串输入完毕:");
        for (i=0;i<xx;i++)
        {
                a[i]=p[i];                //二次数组与指针数组建立关系
                
                
                for (k=0;k<30;k++)         //输入字符串
                {
                        p[i][k]=getchar();
                        if(p[i][k]=='\n')      //每一次回车,表明一个字符串输入完成
                        {
                                p[i][k]='\0';
                                break;
                        }
                }
                if ( a[i]=="" && a[i-1]=="" && a[i-2]=="")
                {
                        break;
                }
                
                        
        }
        
        printf("\n\n");
        pxx(a,xx);
        
        
        
        for (i=0;i<xx;i++)         //打印排序后的字符串
        {
                printf("%s\n",a[i]);
                
        }
        printf("\n");
        
        return 0;
        
}

void pxx(char *b[],int n)     //函数定义
{
        int i,k;
        char *temp;
        for (i=n;i>0;i--)
        {
                for(k=0;k<i-1;k++)
                        if(strcmp(b[k],b[k+1])>0)
                        {
                                temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;
                                
                        }
        }
}// 楼上第二个问题,怎么解决一点头绪也没有,求指点</p>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 23:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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