我有一个旧程序,其中使用了一些库函数,但我没有那个库。
因此,我正在使用c++库编写该程序。在旧代码中有一些函数,它的调用方式如下
*string =newstrdup(“这里有字符串”);
string变量声明为char **string;
他在名为"newstrdup“的函数中做了什么?我试了很多东西,但我不知道他在做什么……有人能帮上忙吗
发布于 2009-03-09 04:59:38
他们写一个“新”版本的strdup肯定是有原因的。所以它一定有一个不同处理方式的转角案例。例如,空字符串可能返回空字符串。
litb的答案是strdup的替代品,但我认为他们这样做是有原因的。
如果您想直接使用strdup,请使用定义对其进行重命名,而不是编写新代码。
发布于 2009-03-09 04:36:53
该函数用于制作c字符串的副本。这通常是获取字符串文字的可写版本所需要的。它们(字符串文字)本身是不可写的,所以这样的函数将它们复制到分配的可写缓冲区中。然后,您可以将它们传递给修改给定参数的函数,如strtok,它将其写入它必须标记的字符串中。
我认为你可以想出这样的东西,因为它被称为new__strdup
char * newstrdup(char const* str) {
char *c = new char[std::strlen(str) + 1];
std::strcpy(c, str);
return c;
}一旦使用了字符串,就应该释放它。
delete[] *string;另一种编写方式是使用malloc。如果库是旧的,它可能已经使用了该库,这是C++从C:
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,而在这种情况下,第一个版本将抛出异常。当您向newstrdup传递NULL参数时,应该注意另一个注意事项。这取决于您的库可能被允许还是不被允许。因此,如果需要的话,在上面的函数中插入适当的检查。POSIX系统中有一个名为strdup的函数,但该函数既不允许NULL参数,也不使用C++操作符new来分配内存。
无论如何,我在谷歌代码搜索中查找了newstrdup函数,发现了相当多。也许你的库就在结果中:
Google CodeSearch, newstrdup
发布于 2010-06-27 21:50:19
对于newstrdup来说,*string = newstrdup("Some string goes here");这一行并没有显示出任何奇怪之处。如果string的类型是char **,那么newstrdup就会像预期的那样返回char *。假设已经将string设置为指向char *类型的变量,结果将放置在该变量中。否则,代码将通过未初始化的指针写入。
https://stackoverflow.com/questions/625010
复制相似问题