最近被一个小问题给弄晕呼了,没有办法人太笨了,基础又不好…… 我最近要把一个String的数值转换为 unsigned short int类型,Socket里面的sockaddr_in的sin_port使的就这。 开始尝试了使用标准库istringstream和ostringstream来解决,也就是: std::istringstream str(strPort);
unsigned
short nPort;
str<<strPort;
str>>nPort;
但是很遗憾,转换的数值是错误的。 后来看到了可以用: nPort = (
char*)strPort.c_str();
转换到 char*,我就类似的使用了: nPort = (unsigned
short)strPort.c_str();
结果数值还是错误的! 后来我查了一下CPPReference: c_str
Syntax:
#include <
string>
const char* c_str();
The function c_str() returns a
const pointer to a regular C
string, identical to the current
string. The returned
string is null-terminated.
Note that since the returned pointer
is of type (C/C++ Keywords)
const, the character data that c_str() returns cannot be modified.
原文地址: 这才知道,原来c_str 只能够返回const char*, 没有办法,我查询还有没有别的转换的方法,很遗憾,都没有。 最后我是采用这个办法解决的: nPort = atoi((
char*)strPort.c_str());
我写了一个测试用的小东西: #include <iostream>
// #include <sstream.h> #include <
string>
// #include <winsock2.h> using namespace std;
void test()
{
// ostringstream oss; // oss.str("abc"); string strIP = "127.0.0.1";
string strPort = "2000";
char* szRemoteAddr = "";
unsigned
short nPort ;
szRemoteAddr = (
char*)strIP.c_str();
// nPort = atoi((char*)strPort.c_str()); nPort = atoi((
char*)strPort.c_str());
// cout<<strIP<<endl; // cout<<szRemoteAddr<<endl; cout << "This is old one:" << strPort << endl;
cout << "This is new one:" << nPort << endl;
}
int main(
int argc,
char* argv[])
{
test();
return 0;
}
最后验证出来是正确的! 郁闷啊,这样一个小问题都把我搞得要死,唉……