鱼C论坛

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

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

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

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

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

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

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

  8.         for (i = 0; i < 5; i++)
  9.         {
  10.                 for (j = 0; j < 5; j++)
  11.                 {
  12.                         if (i > strlen((*p)[j]) - 1)//这里语法看得懂,但是逻辑看不懂
  13.                         {
  14.                                 break;
  15.                         }
  16.                         printf("%c ", (*p)[j][i]);
  17.                 }
  18.                 printf("\n");
  19.         }

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

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

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

  8.         for (i = 0; i < 5; i++)
  9.         {
  10.                 for (j = 0; j < 5; j++)
  11.                 {
  12.                         printf("当i=%d,j=%d时\n", i, j);
  13.                         printf("i > strlen((*p)[j]) - 1\n");
  14.                         printf("%d > %d - 1\n", i, strlen((*p)[j]));
  15.                         if(i > strlen((*p)[j]) - 1)
  16.                                 printf("条件为真,跳过当前字母和空格\n");
  17.                         else
  18.                                 printf("条件为假,打印字母%c和空格\n", (*p)[j][i]);
  19.                         printf("\n");
  20.                 }
  21.                 printf("换到下一行\n");
  22.                 printf("\n");
  23.         }

  24.         return 0;
  25. }
复制代码


怎么样?^_^

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

  1. 当i=2,j=1时
  2. i > strlen((*p)[j]) - 1
  3. 2 > 4 - 1
  4. 条件为假,打印字母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决定是不是打印当前字母

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

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

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

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

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

  21. 换到下一行

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

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

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

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

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

  42. 换到下一行

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

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

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

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

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

  63. 换到下一行

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

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

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

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

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

  84. 换到下一行

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

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

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

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

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

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

使用道具 举报

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

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

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

  8.         for (i = 0; i < 5; i++)
  9.         {
  10.                 for (j = 0; j < 5; j++)
  11.                 {
  12.                         printf("当i=%d,j=%d时\n", i, j);
  13.                         printf("i > strlen((*p)[j]) - 1\n");
  14.                         printf("%d > %d - 1\n", i, strlen((*p)[j]));
  15.                         if(i > strlen((*p)[j]) - 1)
  16.                                 printf("条件为真,跳过当前字母和空格\n");
  17.                         else
  18.                                 printf("条件为假,打印字母%c和空格\n", (*p)[j][i]);
  19.                         printf("\n");
  20.                 }
  21.                 printf("换到下一行\n");
  22.                 printf("\n");
  23.         }

  24.         return 0;
  25. }
复制代码


怎么样?^_^

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

  1. 当i=2,j=1时
  2. i > strlen((*p)[j]) - 1
  3. 2 > 4 - 1
  4. 条件为假,打印字母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, 2024-4-28 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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