jzzc 发表于 2020-2-7 22:19:26

数组指针课后题求助

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

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

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

      return 0;
}题目要求是转置打印出字符串,这是小甲鱼的代码,关于循环的跳出条件的逻辑我实在是看不懂,求大佬指点,满足break的条件到底意味着什么?

召唤风云 发表于 2020-2-7 23:24:28

这个代码我曾经看过。虽然我看不懂,但我知道这句话的作用。比如说,wow只有三个字符。显然不能去打印第4个字符。这段代码的作用就是提前终止。

jzzc 发表于 2020-2-8 11:35:18

@人造人 @小酒酒呢 两位大大可以帮忙解答一下嘛,不胜感激{:5_105:}

召唤风云 发表于 2020-2-8 13:06:22

jzzc 发表于 2020-2-8 11:35
@人造人 @小酒酒呢 两位大大可以帮忙解答一下嘛,不胜感激

我记得论坛有一个规则,不要点名,请某人回答问题,会影响其他人答题的积极性。

人造人 发表于 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)) - 1)
这个if决定是不是打印当前字母

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

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

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

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

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

换到下一行

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

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

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

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

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

换到下一行

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

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

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

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

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

换到下一行

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

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

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

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

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

换到下一行

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

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

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

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

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

换到下一行

人造人 发表于 2020-2-8 13:52:54

不知道上面的解释你是不是满意
还有,你是不是感觉上面的那段话有点怪怪的,^_^

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

int main()
{
      char *array = {"FishC", "Five", "Star", "Good", "Wow"};
      char *(*p) = &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)) - 1\n");
                        printf("%d > %d - 1\n", i, strlen((*p)));
                        if(i > strlen((*p)) - 1)
                                printf("条件为真,跳过当前字母和空格\n");
                        else
                                printf("条件为假,打印字母%c和空格\n", (*p));
                        printf("\n");
                }
                printf("换到下一行\n");
                printf("\n");
      }

      return 0;
}

怎么样?^_^

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

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

像这样,带入确定的值,然后看看会发生什么,这样多分析几种情况就理解了

jzzc 发表于 2020-2-8 20:53:58

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

不好意思我不晓得,这个规则具体在哪里可以发一下链接吗{:5_99:}

jzzc 发表于 2020-2-8 20:58:31

人造人 发表于 2020-2-8 13:52
不知道上面的解释你是不是满意
还有,你是不是感觉上面的那段话有点怪怪的,^_^



好强,这种分析方法我确实没想到,现在我明白了,i还可以理解为打印原字符串的第(i+1)个字母,这样子那个if语句就更容易看懂了,谢谢人造人{:5_95:}

人造人 发表于 2020-2-8 21:29:12

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

^_^

人造人 发表于 2020-2-8 21:30:57

jzzc 发表于 2020-2-8 20:53
不好意思我不晓得,这个规则具体在哪里可以发一下链接吗

^_^

人造人 发表于 2020-2-8 21:33:01

另外,这图片压缩的也太厉害了,都看不清上面的字了

@小甲鱼

jzzc 发表于 2020-2-8 21:59:41

人造人 发表于 2020-2-8 21:30
^_^

好滴,以后我会注意{:5_109:}

小甲鱼 发表于 2020-2-9 00:33:53

人造人 发表于 2020-2-8 21:33
另外,这图片压缩的也太厉害了,都看不清上面的字了

@小甲鱼

好的,我尝试处理一下~

小甲鱼 发表于 2020-2-9 01:38:55

小甲鱼 发表于 2020-2-9 00:33
好的,我尝试处理一下~

可以了,点击图片可以打开原图。

人造人 发表于 2020-2-9 01:44:47

小甲鱼 发表于 2020-2-9 00:33
好的,我尝试处理一下~

^_^
页: [1]
查看完整版本: 数组指针课后题求助