C 检查字符**数组中的值

C 检查字符**数组中的值,c,C,我得到了一个char**函数,它显然返回一个char数组。。。。问题是我不知道数组中填充了多少字符串。。。。字符*数据[数据的大小];已在第一次设置,但函数可能不需要所有数组字段 假设我得到了int size_of_data=100,但它只有15个字符串。。。。如果我想在第15个字符串之后断开,我需要在C。。。我已经在一个字符**字段中获取了数据,并尝试了类似于 while(strcmp(data[i],'\0')) { msg_send (session, para[0],data[

我得到了一个char**函数,它显然返回一个char数组。。。。问题是我不知道数组中填充了多少字符串。。。。字符*数据[数据的大小];已在第一次设置,但函数可能不需要所有数组字段

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

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

在char**函数中,可以在数组末尾放置空指针。所以在本例中,在第15个字符串后面加一个NULL。然后,在while循环中检查数据[i]==NULL,如果结束的话。

在char**函数中,可以在数组的末尾放置一个NULL指针。所以在本例中,在第15个字符串后面加一个NULL。然后在while循环中检查数据[i]==NULL,如果结束了。

正确的方法是让函数将NULL指针0放入数据数组中第一个未使用的位置

只需检查当前指针是否为0即可测试:

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

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

只需检查当前指针是否为0即可测试:

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

您可以做的一件事是还提供数组的大小作为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 ** 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字符*的数组。如果你都用呢?没有空指针,您的缓冲区将溢出。当然,您可以在末尾添加一个额外的指针作为分隔符,但就我个人而言,我喜欢使用大小。

基本上,您可以做两件常见的事情,一种是使用空指针指示数组的结尾,另一种是返回一个包含额外大小(包含元素数量)的结构。第二个版本也有一个变体,使用迭代器习惯用法

结束为空: 然后,调用方将在遇到NULL时停止从结果数组中读取

分开大小 C++中的迭代器习语 这有一个优点,可以很好地用于循环:

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

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

基本上,您可以做两件常见的事情,一种是使用空指针指示数组的结尾,另一种是返回包含额外大小(包含元素数量)的结构。第二个版本也有一个变体,使用迭代器习惯用法

结束为空: 然后,调用方将在遇到NULL时停止从结果数组中读取

分开大小 C++中的迭代器习语 这有一个优点,可以很好地用于循环:

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

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

您知道C如何对任何类型数组的结尾进行签名吗?告诉我我认为NULL或'\0',但我错了。。。我仍在与c。。。来自Java您知道C如何对任何类型数组的结尾进行签名吗?告诉我我认为是NULL或“\0”,但我错了。。。我仍在与c。。。来自Javathnks,但是没有其他方法。。。我想知道的是,如果我不把空指针放在c中,在char*data[15]处会发生什么。。。类似“\0”或NULL之类的内容应自动设置,否则指针指向堆上数据[15]处的哪个元素?如果不是NULL,则为thnks,但没有其他方法。。。我想知道的是,如果我不把空指针放在c中,在char*data[15]处会发生什么。。。应该自动设置“\0”或NULL之类的内容,否则指针会指向堆上数据[15]处的哪个元素?如果不是NULL,Out参数对我来说总是很麻烦。即使某些标准接口使用它。出于风格原因,您也可以将函数签名写为void functionchar**arr,size\u t*num。我认为这看起来有点好,而且在我看来,意图更为明确。Out参数对我来说总是像一个黑客。即使某些标准接口使用它。出于风格原因,您也可以将函数签名写为void functionchar**arr,size\u t*num。我认为这看起来有点好,在我看来,意图更明确。