C 将字符**转换为字符*或字符
我有一个旧程序,其中使用了一些库函数,但我没有那个库 所以我用C++库编写了这个程序。 在那段旧代码中,有一个函数被这样调用 *string=newstrdup(“这里有一些字符串”) 字符串变量声明为char**string 他在名为“newstrdup”的函数中可能在做什么?C 将字符**转换为字符*或字符,c,pointers,char,c-strings,C,Pointers,Char,C Strings,我有一个旧程序,其中使用了一些库函数,但我没有那个库 所以我用C++库编写了这个程序。 在那段旧代码中,有一个函数被这样调用 *string=newstrdup(“这里有一些字符串”) 字符串变量声明为char**string 他在名为“newstrdup”的函数中可能在做什么? 我尝试了很多事情,但我不知道他在做什么。。。有人能帮忙吗newstrdup可能正在生成一个新字符串,该字符串与传递的字符串重复;它返回一个指向字符串的指针(该指针本身就是指向字符的指针)。newstrdup可能正在生成
我尝试了很多事情,但我不知道他在做什么。。。有人能帮忙吗newstrdup可能正在生成一个新字符串,该字符串与传递的字符串重复;它返回一个指向字符串的指针(该指针本身就是指向字符的指针)。newstrdup可能正在生成一个新字符串,该字符串与传递的字符串重复;它返回一个指向字符串的指针(该指针本身就是指向字符的指针)。看起来他编写了一个strdup()函数来操作现有指针,可能是将其重新分配到一个新的大小,然后填充其内容。很可能,他这样做是为了在循环中重复使用相同的指针,*string将频繁更改,同时防止后续每次调用strdup()时发生泄漏 我可能会实现类似string=redup(&string,“newcontents”)。。但那只是我 编辑: 下面是我的“redup”功能的一个片段,它可能会以不同的方式执行与您发布的类似的操作:
int redup(char **s1, const char *s2)
{
size_t len, size;
if (s2 == NULL)
return -1;
len = strlen(s2);
size = len + 1;
*s1 = realloc(*s1, size);
if (*s1 == NULL)
return -1;
memset(*s1, 0, size);
memcpy(*s1, s2, len);
return len;
}
当然,如果realloc()失败,我可能应该保存*s1的一个副本并将其还原,但我不需要那么多疑。看起来他编写了一个strdup()函数来操作现有指针,可能是将其重新分配到一个新的大小,然后填充其内容。很可能,他这样做是为了在循环中重复使用相同的指针,*string将频繁更改,同时防止后续每次调用strdup()时发生泄漏 我可能会实现类似string=redup(&string,“newcontents”)。。但那只是我 编辑: 下面是我的“redup”功能的一个片段,它可能会以不同的方式执行与您发布的类似的操作:
int redup(char **s1, const char *s2)
{
size_t len, size;
if (s2 == NULL)
return -1;
len = strlen(s2);
size = len + 1;
*s1 = realloc(*s1, size);
if (*s1 == NULL)
return -1;
memset(*s1, 0, size);
memcpy(*s1, s2, len);
return len;
}
当然,如果realloc()失败,我可能应该保存*s1的一个副本并将其还原,但我不需要那么多疑。该函数用于制作c字符串的副本。这通常是获取字符串文字的可写版本所需要的。它们(字符串文本)本身是不可写的,因此这样的函数将它们复制到分配的可写缓冲区中。然后,您可以将它们传递给修改给定参数的函数,如
strtok
,该函数将其写入必须标记的字符串中
我想你可以想出这样的东西,因为它被称为newstrdup:
您应该在使用字符串完成后使用
delete[] *string;
另一种编写方法是使用malloc
。如果库是旧的,它可能已经使用了C++,它继承了C:< /P>
char * newstrdup(char const* str) {
char *c = (char*) malloc(std::strlen(str) + 1);
if(c != NULL) {
std::strcpy(c, str);
}
return c;
}
现在,您应该在完成后使用free
释放字符串:
free(*string);
如果你用C++编写,首选第一个版本。但是,如果现有代码使用
free
再次释放内存,请使用第二个版本。注意,如果没有内存可用于复制字符串,则第二个版本返回NULL
,而第一个版本在这种情况下抛出异常。当您将NULL
参数传递给newstrdup
时,应注意另一个行为。这取决于您的库,可能允许也可能不允许。因此,如有必要,在上述函数中插入适当的检查。POSIX系统中有一个名为strdup
的函数,但该函数既不允许NULL
参数,也不使用C++
运算符new分配内存
不管怎样,我用谷歌代码搜索搜索了newstrdup
函数,找到了不少。也许您的库是结果之一:
该函数用于制作c字符串的副本。这通常是获取字符串文字的可写版本所需要的。它们(字符串文本)本身是不可写的,因此这样的函数将它们复制到分配的可写缓冲区中。然后,您可以将它们传递给修改给定参数的函数,如
strtok
,该函数将其写入必须标记的字符串中
我想你可以想出这样的东西,因为它被称为newstrdup:
您应该在使用字符串完成后使用
delete[] *string;
另一种编写方法是使用malloc
。如果库是旧的,它可能已经使用了C++,它继承了C:< /P>
char * newstrdup(char const* str) {
char *c = (char*) malloc(std::strlen(str) + 1);
if(c != NULL) {
std::strcpy(c, str);
}
return c;
}
现在,您应该在完成后使用free
释放字符串:
free(*string);
如果你用C++编写,首选第一个版本。但是,如果现有代码使用
free
再次释放内存,请使用第二个版本。注意,如果没有内存可用于复制字符串,则第二个版本返回NULL
,而第一个版本在这种情况下抛出异常。当您将NULL
参数传递给newstrdup
时,应注意另一个行为。这取决于您的库,可能允许也可能不允许。因此,如有必要,在上述函数中插入适当的检查。POSIX系统中有一个名为strdup
的函数,但该函数既不允许NULL
参数,也不使用C++
运算符new分配内存
不管怎样,我用谷歌代码搜索搜索了newstrdup
函数,找到了不少。也许您的库是结果之一:
我认为您需要查看代码中“string”变量的情况,因为newstrdup()函数的原型似乎与库strdup()版本相同 代码中是否有任何空闲(*字符串)调用 它是w