鱼C论坛

 找回密码
 立即注册
查看: 1897|回复: 4

[已解决]二级指针输出以及循环输出求助

[复制链接]
发表于 2017-11-22 15:01:15 | 显示全部楼层 |阅读模式

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

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

x
为什么我的这个程序,这么写输出的时候少输出一个字母s
#include<stdio.h>
  9 #include<stdlib.h>
 10
 11
 12 int main(void)
 13 {
 14         char *ing[5];
 15         char *name = "shi";
 16         char *fers = "jinl";
 17         char *hello = "nishi";
 18         char *nnw = "nihao";
 19         char *haod = "woshi";
 20
 21         ing[0] = name;
 22         ing[1] = fers;
 23         ing[2] = hello;
 24         ing[3] = nnw;
 25         ing[4] = haod;
 26
 27
 28         while (**ing - 1 != '\0')
 29         {
 30                 *(*ing)++;
 31                 printf("%c", **ing);
 32         }
 33
 34         return 0;
 35 }

这么写却不会少输出s呢
int main(void)
 13 {
 14         char *ing[5];
 15         char *name = "shi";
 16         char *fers = "jinl";
 17         char *hello = "nishi";
 18         char *nnw = "nihao";
 19         char *haod = "woshi";
 20
 21         ing[0] = name;
 22         ing[1] = fers;
 23         ing[2] = hello;
 24         ing[3] = nnw;
 25         ing[4] = haod;
 26
 27
 28         while (**ing - 1 != '\0')
 29         {
 30                 printf("%c", *(*ing)++);
 31         }
 32
 33         return 0;
 34 }
这里面更改的地方是while循环那个地方
求大神给指点
还有如果能德华能顺道说一下,为什么二级指针循环哪里需要减一呢,我只是通过实验弄成减一是可行的,但是原理我我从网上没有查到什么还请大神给指点
最佳答案
2017-11-22 16:14:20
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字符串中的第一个字符‘s’,
所以**ing - 1并没有什么意义,循环不会退出,*(*ing)++后,这时**ing 指向“shi”中的第二个字符'h',后面才printf,所以第一个程序不会显示字符‘s’;第二个程序可以打出's',是因为*(*ing)++会在printf之后执行。给你个实现的代码吧。
for (int i = 0; i < 5; i++)
        {
                *ing = ing[i];                        
                while (**ing != '\0')
                {
                        printf("%c", *(*ing)++);
                }
                printf("\r\n");
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-22 15:48:28 From FishC Mobile | 显示全部楼层
指针自增的问题
实际输出时应该先输出再自增,而不是先自增再输出
为什么需要-1
因为循环体内的自增操作会将指针指向下一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-22 16:14:20 | 显示全部楼层    本楼为最佳答案   
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字符串中的第一个字符‘s’,
所以**ing - 1并没有什么意义,循环不会退出,*(*ing)++后,这时**ing 指向“shi”中的第二个字符'h',后面才printf,所以第一个程序不会显示字符‘s’;第二个程序可以打出's',是因为*(*ing)++会在printf之后执行。给你个实现的代码吧。
for (int i = 0; i < 5; i++)
        {
                *ing = ing[i];                        
                while (**ing != '\0')
                {
                        printf("%c", *(*ing)++);
                }
                printf("\r\n");
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-23 12:32:27 | 显示全部楼层
上善若水··· 发表于 2017-11-22 16:14
首先,你这个写法就很有问题,应该说是不能这样写的。还是给你解释一下,第一个程序:**ing 指向 “shi”字 ...

为什么你这个指针地址可以传给指针呢?*ing = ing[i];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 09:25:01 | 显示全部楼层
奥普瓯江 发表于 2017-11-23 12:32
为什么你这个指针地址可以传给指针呢?*ing = ing;

因为它们都是地址,你可以将他们看成一个int(其是它的本制就是一个unsigned int), int (*ing) 和 int ing,是不是可以直接赋值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 20:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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