如何测试指针数组的结尾?

时间:2017-05-08 10:08:37

标签: c arrays string pointers

#include <stdio.h>

int main(void) {
    char *t[10]={"Program", "hjl","juyy"};
    int i;


    //printf("%c \n",*t[3]);

    int ch=*t[0];

    for(i=0;*t[i]!='\0';i++){

        printf("%d",i);


    }
    return 0;
}

程序在一段时间内停止工作。有人可以解释原因吗?

2 个答案:

答案 0 :(得分:0)

如果我已正确理解您要输出的内容,则程序可以按以下方式查看。

#include <stdio.h>

int main(void) 
{
    char *t[10] = { "Program", "hjl", "juyy" };

    for ( char **p = t; *p; ++p )
    {
        for ( char *q = *p; *q; ++q ) printf( "%d ", ( unsigned char )*q );
        putchar( '\n' );
    }

    return 0;
}

它的输出是

80 114 111 103 114 97 109 
104 106 108 
106 117 121 121 

由于数组被声明为具有10个元素并且仅使用三个初始化器显式初始化,因此数组的所有其他元素都由零初始化。您可以将此事实用作循环的条件。

答案 1 :(得分:0)

这样定义数组:

char *s[] = {
  "text 1 ...",
  "text 2 ...",
  "text 3 ...",
  NULL
};

执行函数以确定像这样的元素数量:

#include <errno.h>

ssize_t number_of_elements(const char ** p)
{
  ssize_t e = -1; /* Be pessimistic. */

  if (NULL == p)
  {
    errno = EINVAL;
  }
  else
  {
    char * t = p;
    while (NULL != *t)
    {
      ++t;
    }

    e = (ssize_t) (t - p);
  }

  return e;
}

这样称呼它:

#include <stdlib.h>
#include <stdio.h>

ssize_t number_of_elements(const char ** p)

int main(void)
{
  int ec = EXIT_SUCCESS;
  ssize_t e;

  if (-1 == (e = number_of_elements(s)))
  {
    ec = EXIT_FAILURE;
    perror("number_of_elements() failed");
  }
  else
  {
    prints("s has %zd elements.\n", e);
  }

  return ec;
}