努力学C的阿通 发表于 2023-8-8 19:47:40

带你学C带你飞--指针数组与数组指针--课后动动手2题

课后动动手2题的代码是:
#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;
}
请教一下为什么要写
if (i > strlen((*p)) - 1)
                        {
                              break;
                        }

希望各位大神不吝赐教,感谢!

isdkz 发表于 2023-8-8 19:48:14

这段代码是一个嵌套循环,用于打印指针数组中的字符。在这个代码中, array 是一个指针数组,每个元素都是一个指向字符的指针。 p 是一个数组指针,指向指针数组 array 。

在内层循环中, (*p) 表示指针数组中的第j个元素,即一个指向字符的指针。 strlen((*p)) 用于计算该指针指向的字符串的长度。

i 表示外层循环的计数器,用于遍历字符串中的每个字符。 i > strlen((*p)) - 1 表示当 i 大于当前字符串的长度减1时,跳出内层循环。这是因为当 i 大于字符串的长度时,访问字符串中的字符会超出字符串的范围,导致访问非法内存,可能导致程序崩溃。

所以这个判断语句的作用是确保在打印字符之前,先检查当前字符串是否已经结束,如果结束则跳出内层循环,避免访问非法内存。

学习编程中的Ben 发表于 2023-8-8 20:07:01

指针数组与数组指针

好的,让我们来解析一下代码中的 if (i > strlen((*p)) - 1) 的作用。

在这段代码中,char *array 定义了一个指针数组,其中每个元素都是一个指向字符的指针。这意味着 array 是一个数组,每个元素都可以存储一个字符串。

而 char *(*p) = &array; 则是定义了一个指向指针数组的指针,使得 p 指向了 array 数组。

接下来进入两层嵌套的循环。外层循环控制行数,内层循环控制列数。

i 代表行数,j 代表列数。通过 (*p) 可以通过指针数组访问具体字符。

而 if (i > strlen((*p)) - 1) 则是用来判断是否超过了当前字符串的长度。如果超过了,则跳出内层循环,不再打印后续字符。

这是因为当行数 i 大于当前字符串的长度减1时,说明已经访问到了字符串的末尾。此时没有需要打印的字符,可以直接跳出内层循环。

需要注意的是,字符串中的字符索引是从0开始的,所以长度减1用以判断是否超过末尾字符。

希望能够解答你的疑问!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

Mike_python小 发表于 2023-8-8 20:39:52

在给定的代码中,内部的两个嵌套循环(`for (i = 0; i < 5; i++)` 和 `for (j = 0; j < 5; j++)`)用于遍历二维字符数组`array`中的元素,并输出特定的字符。

在每个内部循环的起始处,有一个条件判断语句 `if (i > strlen((*p)) - 1)`。它的作用是判断当前元素的字符串长度是否小于`i+1`,即是否还有足够的字符需要打印。如果没有足够的字符需要打印,则跳出当前内部循环,继续外部循环。

假设有以下的二维字符数组:


char *array = {"FishC", "Five", "Star", "Good", "Wow"};


当`i=0`时,内部循环会依次遍历`array`, `array`, `array`, `array`和`array`。如果某个元素的字符串长度小于等于`i`,则说明该元素没有足够的字符需要打印,因为下标从0开始。此时,为了避免越界访问或输出无意义的字符,通过跳出当前内部循环,能够确保只打印包含足够字符数量的元素。

因此,这段代码的目的是保证只输出字符串中真实存在的字符,避免出现越界访问或打印无意义的字符。

陶远航 发表于 2023-8-9 09:55:39

这段代码是一个嵌套循环,它的目的是将一个字符串数组中的字符按列输出成一个倒三角形状。让我解释一下这段代码中的那个条件语句:if(i>strlen((*p))-1){break;}

首先,让我们逐步分析代码的作用:

1. char* array:定义了一个包含5个指向字符型指针的数组,每个指针指向一个字符串。

2. char* (*p) = &array:定义了一个指向数组 array 的指针,即指向指针数组的指针。这样,p 就指向了 array 数组的首地址。

3. for (i = 0; i < 5; i++):外层循环,用来控制行数。

4. for (j = 0; j < 5; j++):内层循环,用来控制列数。

在内层循环中,代码使用了(*p)[ i]来访问指针数组中的字符串的字符。(*p)[ i] 表示 p 指向的数组中的第 j 个字符串的第 i 个字符。现在让我们来解释条件语句 if(i > strlen((*p)) - 1) { break; } 的作用:

这个条件语句的目的是为了确保在输出字符时不越界。由于输出的是倒三角形,每行的字符数递减,因此在一定行数后,某些字符串可能就不足以输出 i+1 个字符,避免访问不存在的内存。

具体来说,strlen((*p)) 表示指针数组中第 j 个字符串的长度。i 是当前外层循环变量,代表行数。因此,i 大于 strlen((*p)) - 1 意味着在第 j 个字符串的长度范围内,该字符串已经没有足够的字符可以输出到第 i+1 列。所以,这时候内层循环就会被中断(通过 break 语句),避免输出越界字符。

综上所述,这个条件语句是为了确保在输出字符时不越界,只输出字符串中实际存在的字符。

330979351 发表于 2023-8-10 22:49:39

学习了
页: [1]
查看完整版本: 带你学C带你飞--指针数组与数组指针--课后动动手2题