(C++) CString转string 怎么转!!用GetBuffer()不行的!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(C++) CString转string 怎么转!!用GetBuffer()不行的!!!相关的知识,希望对你有一定的参考价值。

--------------------------------------------------------------------
CString wo("xxxxcc");
string s;
s=wo.GetBuffer();
//失败了!!!
//错误信息
1>f:\c++试验\count_machine\count_machine\count_machinedlg.cpp(185) : error C2679: 二进制“=”: 没有找到接受“wchar_t *”类型的右操作数的运算符(或没有可接受的转换)
1> f:\vs 2005 主程序目录\vc\include\xstring(875): 可能是“std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)”
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> f:\vs 2005 主程序目录\vc\include\xstring(880): 或“std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)”
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> f:\vs 2005 主程序目录\vc\include\xstring(885): 或“std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)”
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> 试图匹配参数列表“(std::string, wchar_t *)”时
--------------------------------------------------------------------

CString wo("xxxxcc");
string s(wo.GetBuffer());
//失败了
//错误信息
1>f:\c++试验\count_machine\count_machine\count_machinedlg.cpp(184) : error C2664: “std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::allocator<_Ty> &)”: 不能将参数 1 从“wchar_t *”转换为“const std::allocator<_Ty> &”
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>,
1> _Ty=char
1> ]
1> and
1> [
1> _Ty=char
1> ]
1> 原因如下: 无法从“wchar_t *”转换为“const std::allocator<_Ty>”
1> with
1> [
1> _Ty=char
1> ]
1> 无构造函数可以接受源类型,或构造函数重载决策不明确
-------------------------------------------------------------------

//还有 我把CString所有的成员函数都看了一遍,没有一个的返回值是string的
//那如何才能实现CString到 string的转换啊?
//如果能把CString转成string的话 我就可以有很多处理可以做,
//因为学C++的时候都是用string的
回 vssvss:Format()用这个函数要包含什么头文件吧?
报错:
error C3861: “Format”: 找不到标识符
---
回aaa833:
CString wo("xxxxcc");
string s;
s=(LPCTSTR)wo;
//报错
二进制“=”: 没有找到接受“LPCTSTR”类型的右操作数的运算符(或没有可接受的转换)operator =(const std::basic_string<_Elem,_Traits,_Ax> &)”
//。。。。。。。。。
1> 试图匹配参数列表“(std::string, LPCTSTR)”时

回aaa833:
CString wo("xxxxcc");
string s;
s=(LPCTSTR)wo;
//报错
1>f:\c++试验\count_machine\count_machine\count_machinedlg.cpp(185) : error C2679: 二进制“=”: 没有找到接受“LPCTSTR”类型的右操作数的运算符(或没有可接受的转换)
可能是“std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)”
//。。。。。。。。。
1> 试图匹配参数列表“(std::string, LPCTSTR)”时

不行啊~~~大家答的答案都报错了~!!!!!!!!

CString->std::string 例子:

CString strMfc=“test“;

std::string strStl;

strStl=strMfc.GetBuffer(0);

unicode情形下:

CStringW strw = _T("test");
CStringA stra(strw.GetBuffer(0));
strw.ReleaseBuffer();

std::string imgpath=stra.GetBuffer(0);
stra.ReleaseBuffer();

std::string->CString 例子:

CString strMfc;

std::string strStl=“test“;

strMfc=strStl.c_str();

AfxExtractSubString是截取字符串的函数,很好用,不过美中不足的地方在与它只能使用单个字符作为分割符。

但是这种情况在很多时候都行不通,如果分割符需要是两个字符以上呢?

之前因为这个问题试了很久,也在网上搜索过。不过可惜的是,网上的大部分关于VC截取字符串的文章都是那么同样的几篇,都是写的满复杂然后可以实现了AfxExtractSubString功能而已的,也就是只能用单个字符截取,但是标题却写着用字符串截取字符串,好笑!

不找了,自己写吧。CString里面有Find,然后再组成数组。

void Split(CString source, CStringArray& dest, CString division)
...
dest.RemoveAll();
int pos = 0;
int pre_pos = 0;
while( -1 != pos )...
pre_pos = pos;
pos = source.Find(division,(pos+1));
dest.Add(source.Mid(pre_pos,(pos-pre_pos)));



CString source是需要截取的原字符串,

CStringArray& dest 是最终结果的数组

CString division 是用来做分割符的字符串

备忘:为了适用于Unicode环境,要养成使用_T()宏的习惯

1、格式化字符串

CString s;
s.Format(_T("The num is %d."), i);

2、转为 int

转10进制最好用_ttoi(),它在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi()。用_tcstoul()或者_tcstol()可以把字符串转化成任意进制的(无符号/有符号)长整数。

CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));

3、转为 char *

3.1 强制类型转换为 LPCTSTR,不能修改字符串

LPCTSTR p = s; 或者直接 (LPCTSTR)s;

3.2 使用 GetBuffer 方法

不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。假设你想增加字符串的长度,就必须将你需要的字符空间大小(注意:是字符而不是字节,因为 CString 是以隐含方式感知 Unicode 的)传给它。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

LPTSTR p = s.GetBuffer();
// do something with p
int m = s.GetLength(); // 可能出错!!!
s.ReleaseBuffer();
int n = s.GetLength(); // 保证正确

4、其他

4.1 分割字符串

AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '\n');

CString csFullString(_T("abcd-efg-hijk-lmn"));
CString csTemp;
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, '-'); // 得到 abcd
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 1, '-'); // 得到 efg
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 2, '-'); // 得到 hijk
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 3, '-'); // 得到 lmn

分隔符可以随便指定:
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, 'f'); // 得到 abcd-e

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yysdsyl/archive/2008/05/20/2463662.aspx
参考技术A 1楼回答太好了,正好也解决了我的问题,比如不用_T()时,转换结果写到文件里将看不到原来东西了,太感谢你了!本回答被提问者和网友采纳 参考技术B CString::operator LPCTSTR
operator LPCTSTR ( ) const;

Return Value

A character pointer to the string’s data.

Remarks

This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.
参考技术C 用 Format()试下 我原来用过 参考技术D string()

C++ char 转 string

参考技术A 1.
char转string:
string
s
=
char_array_or_pointer;
2.
实现函数
int
getTenValue(string
s,iStart,iLength)

int
sum
=
0;

for(int
i=iStart;
i<iStart+iLength;
++i)

int
ival
=
s[i];
//A->65,
B->66,
依此类推

sum
+=
(ival
*
pow(10,
iLength-1-(i-iStart)));
//pow是自带函数,注意加上<cmath>



return
sum;

以上是关于(C++) CString转string 怎么转!!用GetBuffer()不行的!!!的主要内容,如果未能解决你的问题,请参考以下文章

C++里stringchar*CString之间的转换

标准C++中的string类的用法总结(转)

char[] 转换成cstring

C++问题,怎么把char数组以ASCII码赋值给CString

string string.h cstring 分别对应的功能。 求详解。

C++中char和wchar_t转换