std::string和char*之间的转化以及传统库函数中如何正确使用?

ni_ch 2004-01-31 09:30:32
我在写socket程序时,想试试std::string
在使用send(...)时,没有问题,因为一个string对象可以通过c_str()输出const char*
但是在使用recv(...)时,我需要建立一个缓冲区接受receive的字符串,但是recv中指定接受缓冲的类型为char*
我却不可以直接传递string&过去,我在MFC中是可以直接使用CString::GetBuffer(1024),可是在这里我是不是只能先new 一个char的数组,得到数据后再构造string?这样做太生硬了。又没有更好的方法呢?
...全文
1443 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
张代军 2004-03-21
  • 打赏
  • 举报
回复
如下:
USES_CONVERTION
W2A
Yssss1980 2004-02-02
  • 打赏
  • 举报
回复
vector不大,很轻便

修改一下
vector<char> vc;
vc.resize(len);//开辟缓冲
recv(hSocket,vc.begin(),len,0);

谢谢arya(行者)的提醒 :)
ni_ch 2004-02-02
  • 打赏
  • 举报
回复
o!我想听听大家是如何协调STL和传统C函数库的关系的,就用vector吗?
ni_ch 2004-02-02
  • 打赏
  • 举报
回复
vector给人的感觉很庞大的样子,不敢随便用
arya 2004-02-02
  • 打赏
  • 举报
回复
to Kavent:
我不记得C++标准说过std::string的底层实现必须是连续内存(std::vector是的). 所以这个问题用string实现是不合适的。
arya 2004-02-02
  • 打赏
  • 举报
回复
To 浪子雪影:
vvc.reserve的用法是错误的。reserve是个“底层”方法,要开辟缓冲区,应该用resize, resize才能让类对象也一致地认为你用它开辟了这么大的一片可用内存。逻辑上正确的用法才有可移植性。
Kavent 2004-02-02
  • 打赏
  • 举报
回复
楼上的兄弟,
你说的string是指cstring(char[]),还是STL中的string templete?
如果是后者,并不是以'\0'结束的。
Yssss1980 2004-02-01
  • 打赏
  • 举报
回复
你要注意的是socket的recv可能会recv到二进制流,所以一般不能使用string,因为string遇到'\0'就停止了
建议还是使用原生的char[]或者vector<char>也可以
这样使用vector<char>
vector<char> vc;
vc.reserve(1024);//开辟缓冲
recv(hSocket,vc.begin(),len,0);
Wolf0403 2004-01-31
  • 打赏
  • 举报
回复
好像。。。一定需要先分配空间作为 buf 的。。。分配空间,然后传递 string::data() 进去呢?我没试验
ni_ch 2004-01-31
  • 打赏
  • 举报
回复
楼上的,你有没有看我的问题?你说得我都知道!你还说错了!
byyyyy 2004-01-31
  • 打赏
  • 举报
回复
std::string 有一个构造函数:
basic_string(size_type __n, _CharT __c,
const allocator_type& __a = allocator_type())
可以从 char 构造。另外可以这样:
std::string s; // call default constructor
s = 'c'; // use char to assign the string.

(1)char *转换到string:
char *cs="char*";
string s=cs; //use the string 's constructor to do it
(2)string转换到char*:
string s="string";
char *cs=s.csr();

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧