鱼C论坛

 找回密码
 立即注册
查看: 1508|回复: 14

[已解决]数组指针课后题求助

[复制链接]
发表于 2020-2-7 22:19:26 | 显示全部楼层 |阅读模式

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

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

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

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        if (i > strlen((*p)[j]) - 1)//这里语法看得懂,但是逻辑看不懂
                        {
                                break;
                        }
                        printf("%c ", (*p)[j][i]);
                }
                printf("\n");
        }

        return 0;
}
题目要求是转置打印出字符串,这是小甲鱼的代码,关于循环的跳出条件的逻辑我实在是看不懂,求大佬指点,满足break的条件到底意味着什么?
最佳答案
2020-2-8 13:52:54
不知道上面的解释你是不是满意
还有,你是不是感觉上面的那段话有点怪怪的,^_^

对,没错,上面的那段话是用程序生成的,原来我是打算人工写的,但是还没有写到一半我就放弃了,我选择用程序生成,^_^
#include <stdio.h>
#include <string.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        printf("当i=%d,j=%d时\n", i, j);
                        printf("i > strlen((*p)[j]) - 1\n");
                        printf("%d > %d - 1\n", i, strlen((*p)[j]));
                        if(i > strlen((*p)[j]) - 1)
                                printf("条件为真,跳过当前字母和空格\n");
                        else
                                printf("条件为假,打印字母%c和空格\n", (*p)[j][i]);
                        printf("\n");
                }
                printf("换到下一行\n");
                printf("\n");
        }

        return 0;
}

怎么样?^_^

这类问题你可以把所有的变量都带入一个确定的值,然后看看会发生什么
例如
当i=3,j=4时
i > strlen((*p)[j]) - 1
3 > 3 - 1
条件为真,跳过当前字母和空格
当i=2,j=1时
i > strlen((*p)[j]) - 1
2 > 4 - 1
条件为假,打印字母v和空格

像这样,带入确定的值,然后看看会发生什么,这样多分析几种情况就理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-7 23:24:28 From FishC Mobile | 显示全部楼层
这个代码我曾经看过。虽然我看不懂,但我知道这句话的作用。比如说,wow只有三个字符。显然不能去打印第4个字符。这段代码的作用就是提前终止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 11:35:18 | 显示全部楼层
@人造人 @小酒酒呢 两位大大可以帮忙解答一下嘛,不胜感激
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-8 13:06:22 From FishC Mobile | 显示全部楼层
jzzc 发表于 2020-2-8 11:35
@人造人 @小酒酒呢 两位大大可以帮忙解答一下嘛,不胜感激

我记得论坛有一个规则,不要点名,请某人回答问题,会影响其他人答题的积极性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-8 13:45:57 | 显示全部楼层
外层的for循环用于控制打印的行
i = 0时打印到第0行
i = 1时打印到第1行
i = 2时打印到第2行
i = 3时打印到第3行
i = 4时打印到第4行

内层for循环用于控制打印哪个单词
j = 0时打印单词FishC
j = 1时打印单词Five
j = 2时打印单词Star
j = 3时打印单词Good
j = 4时打印单词Wow

打印单词是通过打印一个字母一个字母的方式实现的
if(i > strlen((*p)[j]) - 1)
这个if决定是不是打印当前字母
当i=0,j=0时
i > strlen((*p)[j]) - 1
0 > 5 - 1
条件为假,打印字母F和空格

当i=0,j=1时
i > strlen((*p)[j]) - 1
0 > 4 - 1
条件为假,打印字母F和空格

当i=0,j=2时
i > strlen((*p)[j]) - 1
0 > 4 - 1
条件为假,打印字母S和空格

当i=0,j=3时
i > strlen((*p)[j]) - 1
0 > 4 - 1
条件为假,打印字母G和空格

当i=0,j=4时
i > strlen((*p)[j]) - 1
0 > 3 - 1
条件为假,打印字母W和空格

换到下一行

当i=1,j=0时
i > strlen((*p)[j]) - 1
1 > 5 - 1
条件为假,打印字母i和空格

当i=1,j=1时
i > strlen((*p)[j]) - 1
1 > 4 - 1
条件为假,打印字母i和空格

当i=1,j=2时
i > strlen((*p)[j]) - 1
1 > 4 - 1
条件为假,打印字母t和空格

当i=1,j=3时
i > strlen((*p)[j]) - 1
1 > 4 - 1
条件为假,打印字母o和空格

当i=1,j=4时
i > strlen((*p)[j]) - 1
1 > 3 - 1
条件为假,打印字母o和空格

换到下一行

当i=2,j=0时
i > strlen((*p)[j]) - 1
2 > 5 - 1
条件为假,打印字母s和空格

当i=2,j=1时
i > strlen((*p)[j]) - 1
2 > 4 - 1
条件为假,打印字母v和空格

当i=2,j=2时
i > strlen((*p)[j]) - 1
2 > 4 - 1
条件为假,打印字母a和空格

当i=2,j=3时
i > strlen((*p)[j]) - 1
2 > 4 - 1
条件为假,打印字母o和空格

当i=2,j=4时
i > strlen((*p)[j]) - 1
2 > 3 - 1
条件为假,打印字母w和空格

换到下一行

当i=3,j=0时
i > strlen((*p)[j]) - 1
3 > 5 - 1
条件为假,打印字母h和空格

当i=3,j=1时
i > strlen((*p)[j]) - 1
3 > 4 - 1
条件为假,打印字母e和空格

当i=3,j=2时
i > strlen((*p)[j]) - 1
3 > 4 - 1
条件为假,打印字母r和空格

当i=3,j=3时
i > strlen((*p)[j]) - 1
3 > 4 - 1
条件为假,打印字母d和空格

当i=3,j=4时
i > strlen((*p)[j]) - 1
3 > 3 - 1
条件为真,跳过当前字母和空格

换到下一行

当i=4,j=0时
i > strlen((*p)[j]) - 1
4 > 5 - 1
条件为假,打印字母C和空格

当i=4,j=1时
i > strlen((*p)[j]) - 1
4 > 4 - 1
条件为真,跳过当前字母和空格

当i=4,j=2时
i > strlen((*p)[j]) - 1
4 > 4 - 1
条件为真,跳过当前字母和空格

当i=4,j=3时
i > strlen((*p)[j]) - 1
4 > 4 - 1
条件为真,跳过当前字母和空格

当i=4,j=4时
i > strlen((*p)[j]) - 1
4 > 3 - 1
条件为真,跳过当前字母和空格

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

使用道具 举报

发表于 2020-2-8 13:52:54 | 显示全部楼层    本楼为最佳答案   
不知道上面的解释你是不是满意
还有,你是不是感觉上面的那段话有点怪怪的,^_^

对,没错,上面的那段话是用程序生成的,原来我是打算人工写的,但是还没有写到一半我就放弃了,我选择用程序生成,^_^
#include <stdio.h>
#include <string.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        printf("当i=%d,j=%d时\n", i, j);
                        printf("i > strlen((*p)[j]) - 1\n");
                        printf("%d > %d - 1\n", i, strlen((*p)[j]));
                        if(i > strlen((*p)[j]) - 1)
                                printf("条件为真,跳过当前字母和空格\n");
                        else
                                printf("条件为假,打印字母%c和空格\n", (*p)[j][i]);
                        printf("\n");
                }
                printf("换到下一行\n");
                printf("\n");
        }

        return 0;
}

怎么样?^_^

这类问题你可以把所有的变量都带入一个确定的值,然后看看会发生什么
例如
当i=3,j=4时
i > strlen((*p)[j]) - 1
3 > 3 - 1
条件为真,跳过当前字母和空格
当i=2,j=1时
i > strlen((*p)[j]) - 1
2 > 4 - 1
条件为假,打印字母v和空格

像这样,带入确定的值,然后看看会发生什么,这样多分析几种情况就理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 20:53:58 | 显示全部楼层
召唤风云 发表于 2020-2-8 13:06
我记得论坛有一个规则,不要点名,请某人回答问题,会影响其他人答题的积极性。

不好意思我不晓得,这个规则具体在哪里可以发一下链接吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 20:58:31 | 显示全部楼层
人造人 发表于 2020-2-8 13:52
不知道上面的解释你是不是满意
还有,你是不是感觉上面的那段话有点怪怪的,^_^

好强,这种分析方法我确实没想到,现在我明白了,i还可以理解为打印原字符串的第(i+1)个字母,这样子那个if语句就更容易看懂了,谢谢人造人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-8 21:29:12 | 显示全部楼层
jzzc 发表于 2020-2-8 20:58
好强,这种分析方法我确实没想到,现在我明白了,i还可以理解为打印原字符串的第(i+1)个字母,这样子那 ...

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

使用道具 举报

发表于 2020-2-8 21:30:57 | 显示全部楼层
jzzc 发表于 2020-2-8 20:53
不好意思我不晓得,这个规则具体在哪里可以发一下链接吗

^_^

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

使用道具 举报

发表于 2020-2-8 21:33:01 | 显示全部楼层
另外,这图片压缩的也太厉害了,都看不清上面的字了

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

使用道具 举报

 楼主| 发表于 2020-2-8 21:59:41 | 显示全部楼层

好滴,以后我会注意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 00:33:53 | 显示全部楼层
人造人 发表于 2020-2-8 21:33
另外,这图片压缩的也太厉害了,都看不清上面的字了

@小甲鱼


好的,我尝试处理一下~

2020-02-09_1-37-35.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 01:38:55 | 显示全部楼层
小甲鱼 发表于 2020-2-9 00:33
好的,我尝试处理一下~

可以了,点击图片可以打开原图。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 01:44:47 | 显示全部楼层
小甲鱼 发表于 2020-2-9 00:33
好的,我尝试处理一下~

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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