C库中没有itoa以及C++中string没有split方法的原因

c/c++

浏览数:175

2019-4-1

AD:资源代下载服务

个人见解,欢迎讨论。这其实源于c/c++需要自己管理内存,而一个好的惯例是

自己申请的内存要自己释放掉

所以c/c++库函数一般都不会返回指针,你会说有些函数返回指针了呀,如

char *strcpy (char * __dest, const char * __src);

但实际返回的是你传入的__dest,内存还是你申请的

另外像一些用c实现的容器会返回指针,比如我们自己实现一个stack可以这样

typedef struct Stack_T *Stack_T;
void Stack_push(Stack_T stk, void *x);
void *Stack_pop(Stack_T stk);

但事实上pop出来的void *仍然是你自己push进去的,这个stack并不会帮你生成一个*x的copy,它只存你给它的指针而不是实际的变量。所以这个stack只用自己管理自己的内存,它的内存操作是隐藏在函数内部的,与push和pop对应。

顺便说一下c++库中stack,和上面这个c版本的有点不太一样,因为c++里存的是变量的值。它的top会返回一个引用即指针,这个指针对应的内存并不是使用者自己申请的,而是在push的时候stack帮你申请的,pop对应地会释放掉它。所以它的toppop是分开的,否则会产生悬挂指针。

回到c库中为什么没有itoa,正是因为库函数不能帮你申请一块内存,也就无法返回一个字符串。你说我们可以自己申请内存让库函数把字符串写进去。事实上,sprintf已经做了这个工作。幸运的是,c++11中增加了to_string的函数,我们再也不用自己申请内存再用sprintf了。

c++也是一样,库函数的返回不能是一个数组(即指针),所以split之后被分开来的多个字符串就无法返回。用vector或者array是可以的,但库中不应该存在这样的依赖关系,即string不应该依赖vector。而在java中,String.split返回的正是一个数组(即指针),这依赖于java强大的垃圾回收机制。