使用指针扫描指针数组

时间:2016-06-04 14:07:42

标签: c arrays pointers char

这是一个示例,用于检查char指针数组的维度:

#include <stdio.h>
int main(void){

    // prototype
    int checkDim( char **array);

    char *days[] = {      //array of pointers
        "Sunday",         //days[0] = {'S','u','n','d','a','y','\0'}
        "Monday",         //days[1] = {....}
        "Tuesday",        //days[2] = {....}
        "Wednesday",      //days[3] = {....}
        "Thursday",       //days[4] = {....}
        "Friday",         //days[5] = {....}
        "Saturday"        //days[6] = {....}
    };

    int dim;
    dim = checkDim( days );

    printf("Number of days = %i \n", dim );

    return 0;
}

int checkDim(  char **array ){

    char **ptr = array;

    while(*ptr){
        ++ptr;
    }

    return ptr - array;
}

分别为:

days[0]是指向char(另一个数组)的指针,
days[1]是指向char(另一个数组)的指针 ...
days[i]是指向char(另一个数组)的指针

使用while我可以扫描包含指针的数组:

char **ptr = array; //

while(*ptr){
    ++ptr;
}

如何停止第一个元素days[0]并扫描每个字母以检查days[0]的长度(随后days[1]days[2]等...)?

我想要printf这样的(例如):

> Number of days 7.

> Sunday is long 6 letters

> Monday is long 6 letters

> Tuesday is long 7 letters

等。

1 个答案:

答案 0 :(得分:0)

首先:

checkDim()因为它在循环经过指针days时通过访问指针数组"Saturday"来调用未定义的行为。

代码似乎运行不好运。

要解决此问题,请在NULL末尾明确引入days值作为哨兵:

  char * days[] = {      //array of pointers
    "Sunday",         //days[0] = {'S','u','n','d','a','y','\0'}
    ...
    "Saturday",        //days[6] = {....}
    NULL
  };

回答你的问题:

打印每个&#34;字符串的长度&#34;在迭代过程中,您可以执行以下操作:

  while (*ptr)
  {
    printf("'%s' has length %zu.\n", *ptr, strlen(*ptr));
    ++ptr;
  }

请注意,strlen()返回size_t(不是int)以使用转化说明符du这里错误。如果正在使用的编译器(VC)未定义zu,则需要使用lu

还有两件事:

  1. 原型的放置

    原型应该在全球范围内。

    所以改变这个:

    int main(void)
    {
      // prototype
      int checkDim( char **array);
    

    是:

    // prototype
    int checkDim( char ** array);
    
    int main(void)
    {
    
  2. 限定参数保持不变为const

    checkDim不会更改days,因此请通过告诉它来帮助编译器创建最佳代码。

    改变这个:

    int checkDim(char **array) 
    

    是:

    int checkDim(const char ** array)