首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将char**转换为char*或char

将char**转换为char*或char
EN

Stack Overflow用户
提问于 2009-03-09 04:27:10
回答 6查看 912关注 0票数 1

我有一个旧程序,其中使用了一些库函数,但我没有那个库。

因此,我正在使用c++库编写该程序。在旧代码中有一些函数,它的调用方式如下

*string =newstrdup(“这里有字符串”);

string变量声明为char **string;

他在名为"newstrdup“的函数中做了什么?我试了很多东西,但我不知道他在做什么……有人能帮上忙吗

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-09 04:59:38

他们写一个“新”版本的strdup肯定是有原因的。所以它一定有一个不同处理方式的转角案例。例如,空字符串可能返回空字符串。

litb的答案是strdup的替代品,但我认为他们这样做是有原因的。

如果您想直接使用strdup,请使用定义对其进行重命名,而不是编写新代码。

票数 3
EN

Stack Overflow用户

发布于 2009-03-09 04:36:53

该函数用于制作c字符串的副本。这通常是获取字符串文字的可写版本所需要的。它们(字符串文字)本身是不可写的,所以这样的函数将它们复制到分配的可写缓冲区中。然后,您可以将它们传递给修改给定参数的函数,如strtok,它将其写入它必须标记的字符串中。

我认为你可以想出这样的东西,因为它被称为new__strdup

代码语言:javascript
复制
char * newstrdup(char const* str) {
    char *c = new char[std::strlen(str) + 1];
    std::strcpy(c, str);
    return c;
}

一旦使用了字符串,就应该释放它。

代码语言:javascript
复制
delete[] *string;

另一种编写方式是使用malloc。如果库是旧的,它可能已经使用了该库,这是C++从C:

代码语言:javascript
复制
char * newstrdup(char const* str) {
    char *c = (char*) malloc(std::strlen(str) + 1);
    if(c != NULL) {
        std::strcpy(c, str);
    }
    return c;
}

现在,您应该在完成后使用free释放字符串:

代码语言:javascript
复制
free(*string);

如果您使用C++编写,请首选第一个版本。但是,如果现有代码再次使用free释放内存,请使用第二个版本。注意,如果没有可用于复制字符串的内存,则第二个版本将返回NULL,而在这种情况下,第一个版本将抛出异常。当您向newstrdup传递NULL参数时,应该注意另一个注意事项。这取决于您的库可能被允许还是不被允许。因此,如果需要的话,在上面的函数中插入适当的检查。POSIX系统中有一个名为strdup的函数,但该函数既不允许NULL参数,也不使用C++操作符new来分配内存。

无论如何,我在谷歌代码搜索中查找了newstrdup函数,发现了相当多。也许你的库就在结果中:

Google CodeSearch, newstrdup

票数 4
EN

Stack Overflow用户

发布于 2010-06-27 21:50:19

对于newstrdup来说,*string = newstrdup("Some string goes here");这一行并没有显示出任何奇怪之处。如果string的类型是char **,那么newstrdup就会像预期的那样返回char *。假设已经将string设置为指向char *类型的变量,结果将放置在该变量中。否则,代码将通过未初始化的指针写入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/625010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档