最近被一个小问题给弄晕呼了,没有办法人太笨了,基础又不好……
我最近要把一个String的数值转换为 unsigned short int类型,Socket里面的sockaddr_in的sin_port使的就这。
开始尝试了使用标准库istringstream和ostringstream来解决,也就是:
后来看到了可以用:
后来我查了一下CPPReference:
这才知道,原来c_str 只能够返回const char*,
没有办法,我查询还有没有别的转换的方法,很遗憾,都没有。
最后我是采用这个办法解决的:
我写了一个测试用的小东西:
郁闷啊,这样一个小问题都把我搞得要死,唉……
我最近要把一个String的数值转换为 unsigned short int类型,Socket里面的sockaddr_in的sin_port使的就这。
开始尝试了使用标准库istringstream和ostringstream来解决,也就是:
std::istringstream str(strPort);
unsigned short nPort;
str<<strPort;
str>>nPort;
但是很遗憾,转换的数值是错误的。
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.
原文地址:
http://www.cppreference.com/cppstring/c_str.html
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;
}
最后验证出来是正确的!
// #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;
}
郁闷啊,这样一个小问题都把我搞得要死,唉……