鱼C论坛

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

指针数组如何赋值?

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

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

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

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

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

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

  8. int main()
  9. {
  10.         char *p[3],a0[20],a1[20],a2[20];
  11.         void p1(char *m[],int n);
  12.         void print(char *w[],int n);
  13.         int i,n=3;        
  14.         printf("请输入 3 个字符串:");
  15.         scanf("%s",a0);
  16.         scanf("%s",a1);
  17.         scanf("%s",a2);
  18.         printf("\n");
  19.         
  20.         for (i=0;i<3;i++)
  21.         {
  22.                 switch (i)
  23.                 {
  24.                 case 0:        p[i]=a0;break;
  25.                         
  26.                 case 1:        p[i]=a1;break;
  27.                         
  28.                 case 2:        p[i]=a2;
  29.                         
  30.                 }
  31.                
  32.         }
  33.    
  34.         print (p,3);
  35.     printf("\n");
  36.         
  37.         p1(p,3);
  38.         
  39.         
  40.         print (p,3);
  41.     printf("\n");
  42.         
  43.         
  44.         return 0;
  45.         
  46. }


  47. void p1(char *m[],int n)
  48. {
  49.         char *temp;
  50.         int i,j,k;
  51.         for (i=0;i<n-1;i++)
  52.         {
  53.                 k=i;
  54.                 for(j=i+1;j<n;j++)
  55.                         if(strcmp(m[k],m[j])>0)
  56.                         {
  57.                                 k=j;
  58.                         }
  59.                         if(k!=i)
  60.                         {
  61.                                 temp=m[i]; m[i]=m[k];m[k]=temp;
  62.                         }
  63.         }
  64.         
  65. }




  66. void print(char *w[],int n)
  67. {
  68.         int i;
  69.         for (i=0;i<n;i++)
  70.         {
  71.                 printf("%s ",w[i]);
  72.         }
  73.         
  74.         printf("\n");
  75.         
  76.         
  77. }
复制代码


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







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

使用道具 举报

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

回帖奖励 +1 鱼币

你这样写不行吧, 定义了三个指针, 没有指向, 你直接指定地址, 会出错的吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-17 13:20:29 | 显示全部楼层
求指点迷津  {:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

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

不知楼主听懂了没
一句话就是指针存放的是地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

回帖奖励 +1 鱼币

用c++来写比较简单的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

想问楼主问题到底是怎样的,是按三个字符串的大小 排序,还是把三个字符串里的每个字母都拿出来放到一起排序?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的问题是,把现有的题改成:“输入1000个字符串,然后按由小到大的顺序输出” 的程序应该如何时来写,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 22:29:43 | 显示全部楼层
c语言好久没看了,字符数组相关知识记的不是很清楚用文字描述代替,见谅
  1. 定义字符数组 s1[1024]和s2[1024],
  2. int seq[1000] #整形数组记录大小顺序
  3. for(i = 1, i <=1000, i++)seq[i]=i;
  4. #用冒泡排序法
  5. for(i = 999, i >= 0,i--)
  6. {
  7.         for(j = 0,j < i,j++)
  8.         {
  9.                 把第j个字符串赋值给s1
  10.                 把第j+1个字符串赋值给s2
  11.                 比较两者大小
  12.                 如果s1>s2
  13.                 交换seq[j]和seq[j+1]
  14.         }
  15. }
  16. 按照seq数组中保存的顺序输出字符串
复制代码
小甲鱼最新课程 -> https://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个字符串;这个就是我要,求教的问题,谢谢。


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

使用道具 举报

发表于 2015-3-19 08:54:51 | 显示全部楼层
  1. char *p[30],str[20];
  2. for(i = 0, i <30, i++)
  3. {
  4.         scanf("%s",str);
  5.         p[i] = str;
  6. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这个,只能输入相同的字符串!而且是最后的那个字符串,因为所有字符串的地址相同。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

可以的,这是个好方法,谢谢
可具体怎么实现?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是不是要用个三维数组才能实现? 即然是数组,那就得先声明行 和列,这样就对输入有了限制(输入字符串不能长于声明)……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


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

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

使用道具 举报

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

请自行参考字符数组相关知识,这个好一点的书都有,你也可以百度,字符数组挺麻烦的,和字符串似乎略有不同~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢 了
小甲鱼最新课程 -> https://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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define xx 1000
  4. int main()
  5. {
  6.         void pxx(char *b[],int n);
  7.         int i;
  8.         char p[xx][30],*a[xx];
  9.         
  10.         for (i=0;i<xx;i++)
  11.         {
  12.                 a[i]=p[i];
  13.         scanf("%s",a[i]);
  14.         }
  15.    
  16.    pxx(a,xx);



  17.         for (i=0;i<xx;i++)
  18.         {
  19.         printf("%s ",a[i]);
  20.                
  21.         }
  22.         printf("\n");

  23. return 0;

  24. }

  25. void pxx(char *b[],int n)
  26. {
  27.         int i,k;
  28.         char *temp;
  29.         for (i=n;i>0;i--)
  30.         {
  31.                 for(k=0;k<i-1;k++)
  32.                 if(strcmp(b[k],b[k+1])>0)
  33.                 {
  34.                         temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;

  35.                 }
  36.         }
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  9.         printf("请输入字符串,按下回车表示一个字符串输入完毕,连续按三次回车表示所有字符串输入完毕:");
  10.         for (i=0;i<xx;i++)
  11.         {
  12.                 a[i]=p[i];                //二次数组与指针数组建立关系
  13.                
  14.                
  15.                 for (k=0;k<30;k++)         //输入字符串
  16.                 {
  17.                         p[i][k]=getchar();
  18.                         if(p[i][k]=='\n')      //每一次回车,表明一个字符串输入完成
  19.                         {
  20.                                 p[i][k]='\0';
  21.                                 break;
  22.                         }
  23.                 }
  24.                 if ( a[i]=="" && a[i-1]=="" && a[i-2]=="")
  25.                 {
  26.                         break;
  27.                 }
  28.                
  29.                         
  30.         }
  31.         
  32.         printf("\n\n");
  33.         pxx(a,xx);
  34.         
  35.         
  36.         
  37.         for (i=0;i<xx;i++)         //打印排序后的字符串
  38.         {
  39.                 printf("%s\n",a[i]);
  40.                
  41.         }
  42.         printf("\n");
  43.         
  44.         return 0;
  45.         
  46. }

  47. void pxx(char *b[],int n)     //函数定义
  48. {
  49.         int i,k;
  50.         char *temp;
  51.         for (i=n;i>0;i--)
  52.         {
  53.                 for(k=0;k<i-1;k++)
  54.                         if(strcmp(b[k],b[k+1])>0)
  55.                         {
  56.                                 temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;
  57.                                 
  58.                         }
  59.         }
  60. }// 楼上第二个问题,怎么解决一点头绪也没有,求指点</p>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 22:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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