首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个 char* 和 std:string 的有关问题

2012-05-15 
一个 char* 和 std::string 的问题代码:C/C++ code#include cstdio#include netinet/in.h#include ar

一个 char* 和 std::string 的问题
代码:

C/C++ code
#include <cstdio>#include <netinet/in.h>#include <arpa/inet.h>#include <string>using namespace std;std::string ip2str(const uint32_t& ip_num){    struct in_addr ip_addr;    ip_addr.s_addr = htonl(ip_num);    return std::string(inet_ntoa(ip_addr));}char* ip2str_char(const uint32_t& ip_num){    struct in_addr ip_addr;    ip_addr.s_addr = htonl(ip_num);    return inet_ntoa(ip_addr);}int main(){    printf("ip2str     : %s, %s\n", ip2str(0xFFFF0000).c_str(), ip2str(0).c_str());    printf("ip2str_char: %s, %s\n", ip2str_char(0xFFFF0000), ip2str_char(0));    return 0;}



运行结果:
C/C++ code
$ ./inline ip2str     : 255.255.0.0, 0.0.0.0ip2str_char: 255.255.0.0, 255.255.0.0$



没想明白是什么道理。望达人指教。

[解决办法]
inet_ntoa 用错了
inet_ntoa 内部使用了静态变量,这样返回值char*才不会失效,每次调用inet_ntoa的返回值都应该是一样的。
当你写一行的话,第二次调用会把第一次覆盖掉的。
用string的话他是拷贝了一份,所以没问题。
[解决办法]
inet_ntoa 是不可重入函数. 最好返回一个copy. 你可以认为他内部返回了一个静态的buf.
[解决办法]
不知道LZ哪里不明白?
printf的格式化输出应该没有问题吧。%s输出char字符串。
c_str()是std::string的成员函数,返回字符串第一个字符才常量char*指针。
htonl是用来本机字节顺序转换成网络字节顺序的函数。
inet_ntoa是转换成IP地址的点分十进制的字符串。
[解决办法]
探讨

引用:
inet_ntoa 用错了
inet_ntoa 内部使用了静态变量,这样返回值char*才不会失效,每次调用inet_ntoa的返回值都应该是一样的。
当你写一行的话,第二次调用会把第一次覆盖掉的。
用string的话他是拷贝了一份,所以没问题。


引用:
inet_ntoa 是不可重入函数. 最好返回一个copy. ……

热点排行