我得到一个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]);
}
答案 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}}其中包含元素的数量。使用迭代器习语还有第二个版本的变体。
size_t
当遇到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};
}
这样做的优点是可以在循环中很好地使用:
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);
}
来轻松确定尺寸。