一个 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地址的点分十进制的字符串。
[解决办法]