0

我得到了一个char **function显然返回一个字符数组....问题是我不知道数组中填充了多少个字符串....char *data[size_of_data];一开始就设置了,但是该函数可能不需要所有数组字段....

假设我得到了int size_of_data = 100,但它只有 15 个字符串....如果我想在第 15 个字符串之后中断,我在 C 中需要哪个条件...我已经在 char ** 字段中获取了数据并尝试了类似的东西。 ...

 while(strcmp(data[i],'\0'))
{
    msg_send (session, para[0],data[i]);
    printf("------> %s \n",data[i]);
}   
4

4 回答 4

1

在您的 char ** 函数中,您可以在数组末尾放置一个 NULL 指针。所以在这种情况下,在第 15 个字符串之后放置一个 NULL。然后在你的 while 循环中检查 data[i] == NULL,如果它就结束了。

于 2012-08-23T19:34:30.863 回答
1

执行此操作的正确方法是让函数将空指针 (0) 放入数据数组中第一个未使用的位置。

这可以通过检查当前指针是否为 0 来简单地测试:

for (i = 0; data[i]; i++) {
    puts(data[i]);
}
于 2012-08-23T19:36:00.667 回答
1

您可以做的一件事是还提供数组的大小作为输出参数。你的函数签名看起来像这样

char ** function(size_t * num_strings); //num_strings is an out parameter

然后你做这样的事情

size_t nstrings = 0;
char **strings = function(&nstrings);
size_t i = 0;
while (i < nstrings) {
    //do stuff
}

知道大小是有好处的,而不是仅仅迭代直到你碰到一个空指针。假设您准备了一个 100 的数组char*。如果你全部使用它们会怎样?没有空指针,你会溢出你的缓冲区。当然,您可以在末尾添加一个额外的指针作为分隔符,但我个人喜欢有大小。

于 2012-08-23T19:48:38.727 回答
1

基本上,您可以做两件常见的事情,或者使用空指针指示数组结尾的约定,或者返回struct包含附加size_t元素数量的 a。第二个版本还有一个变体,它使用了迭代器习语。

结束为空:

char** fun() {
  /* ... */
  char** array = /*...*/;
  unsigned end = 15;
  array[end] = NULL;
  return array;
}

然后,调用者将在遇到NULL.

单独的尺寸

struct {
  size_t size;
  char** array;
} fun() {
   /* ... */
   char** array = /*...*/;
   unsigned end = 15;
   return {end,array};
}

迭代器习语(借自 C++)

struct {
  char** begin;
  char** end;
} fun() {
   /* ... */
   char** array = /*...*/;
   unsigned end = 15;
   return {array,array+end};
}

这具有可以在循环中很好地使用的优点:

for (struct {char** begin; char** end;} it = fun(); it.begin != it.end; ++it.begin) {
  printf("%s\n",it.begin);
}

您还可以通过减法轻松确定大小end - begin

于 2012-08-23T19:50:06.030 回答