检查char **数组的值

时间:2012-08-23 19:27:35

标签: c

我得到一个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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

for (i = 0; data[i]; i++) {
    puts(data[i]);
}

答案 2 :(得分:1)

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

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*的数组。如果你全部使用它会怎么样?没有空指针,你将超出你的缓冲区。当然,你可以在末尾添加一个额外的指针作为分隔符,但我个人喜欢这个大小。

答案 3 :(得分:1)

基本上,您可以执行两项常见操作,即使用空指针指示数组结尾的约定或返回包含其他struct的{​​{1}}其中包含元素的数量。使用迭代器习语还有第二个版本的变体。

end为null:

size_t

当遇到char** fun() { /* ... */ char** array = /*...*/; unsigned end = 15; array[end] = NULL; return array; } 时,调用者将停止从结果数组中读取。

单独的大小

NULL

iterator idiom(从C ++借出)

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

这样做的优点是可以在循环中很好地使用:

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); } 来轻松确定尺寸。