`

VC++中CString和char*的相互转换

    博客分类:
  • VC++
 
阅读更多

 可参考的另外一篇文章:

https://blog.csdn.net/luoweifu/article/details/20232379

转自:https://blog.csdn.net/e_wsq/article/details/26307817

网上转来的 学习下

1.传给未分配内存的const char* (LPCTSTR)指针.
   CString cstr(asdd);
   const char* ch = (LPCTSTR)cstr;
   ch指向的地址和cstr相同。但由于使用const保证ch不会修改,所以安全.

2.传给未分配内存的指针.
    CString cstr = "ASDDSD";
    char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);
    cstr.ReleaseBuffer();
    //修改ch指向的值等于修改cstr里面的值.
    //PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.
3.第二种用法。把CString 值赋给已分配内存的char *。
    CString cstr1 = "ASDDSD";
    int strLength = cstr1.GetLength() + 1;
    char *pValue = new char[strLength];
    strncpy(pValue, cstr1, strLength);
4.第三种用法.把CString 值赋给已分配内存char[]数组.
    CString cstr2 = "ASDDSD";
    int strLength1 = cstr1.GetLength() + 1;
    char chArray[100];
    memset(chArray,0, sizeof(bool) * 100); //将数组的垃圾内容清空.
    strncpy(chArray, cstr1, strLength1);


////////////////////////////////////////////////////////////////////////////////////////////////////////


首先声明我不是一个高手,而是一个初学者,文章同样也是一个初学者对于CString和char*转换的理解。
   因为需要,接触C++一段时间了,其中最为困扰我的问题就是在使用C++的过程中CString和char*的转换,在网上搜索了一下,看到问这个问题的人挺多的。我使用的平台是Win2003+VC 2005,本来这个很简单的问题稍微复杂了一点在2005里面。
    在我的工程里面要集成一个用C开发的程序,用VC做windows窗体的界面,在C的函数中有不少是使用char*作为参数的,因此有一个必不可少的步骤就是把CString转换为shar*字符串。
    作为一个初学者,遇到这个问题,首先是在baidu上搜索了一下转换的方法,有很多结果,别人也说有效,但是我把它放在我的代码里面的时候,就是出现错误。下面是我的解决办法。
    使用CString的GetBuffer方法
        CString origCString("Hello,World");
        char* CharString = origCString.GetBuffer(origCString.GetLength()+1);

    网上的很多文章说的都是这个方法,但是我在VC++2005中编译得到下列信息
        Error 1 error C2440:   'initializing' : cannot convert from 'wchar_t *' to 'char *'  
   对于这个错误不是很理解,因为是刚开始使用VC不久,所以对于wchar_t和char的区别不是很清楚,在MSDN中查看了一下,wchar_t是一个宽字符型,相当于unsignedshort(16bit)。而我们通常使用的char是8bit。继续搜索wchar_t*到char*的转换,msdn上面有一篇文章是Convert Between Various String Types,讲了VC++2005中的各种字符串char *, wchar_t*, _bstr_t, CComBSTR, CString,basic_string, andSystem.String的相互转换。其中将wchar_t*转换为char*的代码如下:(为了保持文章的一致性,修改了变量名)

 

                             

        #include <stdlib.h>
                #include <iostream>
                using namespace std;
 

 

        int main()
        {
          wchar_t *origString = L"Hello,World";
          wcout << origString << endl;

          // Convert to a char*
          size_t origsize = wcslen(origString) + 1;
          const size_t newsize = 100;
          size_t convertedChars = 0;
          char CharString[newsize];
          wcstombs_s(&convertedChars, CharString, origsize, origString , _TRUNCATE);
          cout << CharString << endl;
        }   
 
   输出正确,均为Hello, World!
   结合上面的两段,看看能不能将CString转换为char*
        CString origCString("Hello, World!");
        wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1);
        size_t origsize = wcslen(wCharString) + 1;
        size_t convertedChars = 0;
        char *CharString;
        CharString=new char(origsize);
        wcstombs_s(&convertedChars, CharString, origsize, wCharString , _TRUNCATE);
        cout << CharString << endl;
 
   成功输出字符串"Hello,World"
   至于为什么原来的那段代码别人都能用好,而我在VC++2005下面去不能直接使用,还要通过转换呢?正好看到《Programming Windows》的第二章讲Unicode的和在msdn论坛问了一下相关问题后得到答案。
   原来在VC++ 2005以前,应用程序默认都是关闭对Unicode的支持的,而在VC2005中,默认打开了对它的支持,CString对应的字符串应该是TCHAR,TCHAR的定义是这样的,
        #ifdef _UNICODE
        typedef wchar_t TCHAR    ;
        #else
        typedef char TCHAR;
        #endif

我想这个就是为什么我在VC++2005种不能直接转换的原因。在工程中应该可以关闭对于Unicode的支持,从而可以直接转换。这个做法是右击工程名—〉Property—〉General中的character set中选择notset,这样,本文开头的那段代码就可以正确的执行了。

from:
http://hi.baidu.com/yiduihaodadelaji/blog/item/ffee43240a35582dd5074248.html
http://hi.baidu.com/fish_and_water/blog/item/220cd88faf4404ff513d92d9.html

--------------------- 本文来自 冷月宫主 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/e_wsq/article/details/26307817?utm_source=copy

分享到:
评论

相关推荐

    解决2010VC的复制 遇到的CSTRING 向CHAR转换的问题

    ### 解决2010VC的复制遇到的CSTRING向CHAR转换的问题 在进行文本处理时,尤其是在使用Visual C++ 2010(以下简称VC++2010)进行跨平台或编码格式转换时,经常会遇到字符串类型不匹配的问题。例如,从Unicode编码的`...

    VC++中CString的成员函数

    ### VC++中CString的成员函数详解 在VC++中,`CString`类是MFC(Microsoft Foundation Classes)框架中用于处理字符串的一个核心类。它提供了一系列丰富的成员函数,用于字符串的创建、比较、修改和查询等操作。...

    VC++不同数据类型的转换

    在VC++编程中,经常需要处理各种数据类型之间的转换,特别是字符串类型之间的转换。常见的数据类型包括`CString`、`BSTR`、`std::string`、`char`、`char*`等。本文将详细介绍这些类型之间的相互转换方法。 #### `...

    VC中BSTR、Char和CString类型的转换

    在Microsoft Visual C++ (VC++) 开发环境中,BSTR、Char和CString是三种常见的字符串处理类型,它们在不同的场景下有着各自的用途。了解并掌握它们之间的转换是非常重要的,特别是对于进行Windows API调用或者COM...

    VC++类型转换整理(PDF格式)

    经过类型强制转换,可以将CString类型转换成char*,例如: CString cStr = "Hello,world!"; char* zStr = (char*)(LPCTSTR)cStr; 2、char* to CString char*类型可以直接给CString,完成自动转换,例如: char* ...

    VC之CString,wchar_t,int,string,char*之间的转换

    `CString`、`wchar_t`、`int`、`string`和`char*`都是编程中常用的字符串和数值类型,它们之间互相转换有助于在不同场景下灵活地处理数据。本篇文章将详细介绍这些类型之间的转换方法。 首先,`CString`是Microsoft...

    cstring的相关知识.docx

    - **CString与char*相互转换**: - 使用`CString::GetBuffer/SetBuffer`。 - 直接赋值,如`char* str = CStringVar;`。 - **CString与BSTR型转换**: - 使用`SysAllocString`和`SysFreeString`进行转换。 - **...

    VC++类型转换详解

    - **CString与char\*转换**:使用`GetBuffer()`获取内部缓冲区,或者`strcpy()`进行复制。 - **CString与BSTR型转换**:`LPCTSTR`到`BSTR`使用`SysAllocString()`,反之用`SysFreeString()`。 - **VARIANT型转化...

    CString-int-string-char--change.rar_CString_CString string _char

    以上就是`CString`、`int`、`string`和`char`在VC++环境中进行转换的方法。在实际编程中,要根据具体需求选择合适的转换方式,并注意转换过程中的类型安全和异常处理。在处理字符串时,理解不同类型的特性及它们之间...

    VC++中一些常用的数据类型之间的相互转化

    为此,附件中的资源实现了VC++中多种数据类型之间的相互转换,包括:CString &lt;-&gt; int、CString &lt;-&gt; double、CString &lt;-&gt; LPCSTR、char* &lt;-&gt; CString、char -&gt; CString、string -&gt; const char*等。非常清晰明了、好用...

    CString 转换操作详解

    5. **与`char*`类型的相互转换** a. `char*`到`CString`:可以直接赋值或使用`_T()`宏。 ```cpp char* cString = "example"; CString csExample = cString; // 或者 CString csExample2 = _T(cString); ``` ...

    VC++ 字符串 CString 加密 解密 源码

    在VC++编程环境中,字符串处理是非常常见的任务,而CString是Microsoft MFC(Microsoft Foundation Classes)库提供的一种方便、高效的字符串类。它提供了丰富的成员函数,用于处理和操作字符串。在这个主题中,我们...

    CString转UTF8,UTF8转CString

    通过上述两个函数,我们可以实现`CString`与UTF-8编码字符串之间的相互转换。这对于处理国际化文本或与Web服务交互时非常有用。需要注意的是,在实际应用中应当确保输入数据的有效性,并妥善处理可能发生的异常情况...

    VC中各种不同数据类型的相互转换2(补充)

    本文将详细探讨VC++中涉及的数据类型转换,包括`int`、`long`、`float`、`double`、`char`数组、`char*`、`CString`、`_variant_t`和`_bstr_t`之间的转换方法。 1. **其他数据类型转换为字符串**: - `itoa`函数...

    数据类型转换(VC++VC++)

    在VC++编程中,数据类型转换是至关重要的,它允许我们灵活地在不同类型的变量间进行操作。在从VC++6.0过渡到VS2008的过程中,理解并掌握这些转换方法对于顺利进行代码迁移至关重要。以下是关于各种数据类型转换的...

    vc++中各种字符串含义和转换大全.pdf

    在VC++编程环境中,处理字符串是一项常见的任务,而VC++提供了多种不同的字符串类型,每种类型都有其特定的用途和特点。以下是对标题和描述中提到的几种字符串类型的详细解释: 1. CString类: CString 是MFC...

    VC++类型大全内付转换类型的方法

    在C++编程语言中,尤其是使用Visual C++(VC++)进行开发时,熟悉各种数据类型及其相互之间的转换是非常重要的。下面将详细介绍VC++中的基本数据类型、复合数据类型、字符串类型以及COM接口相关的数据类型,并探讨...

    VC:CString用法整理 详解过程

    **VC++中的CString类是MFC(Microsoft Foundation Classes)库提供的一种字符串类,它提供了丰富的字符串操作功能,比C语言的char数组或C++的std::string在某些方面更为便捷。下面将对CString的用法进行详细的阐述。...

    vc数据类型转换大全

    在VC++编程中,数据类型转换是常见的操作,特别是在处理字符串和数值类型之间。下面将详细介绍标题和描述中提到的一些主要数据类型转换方法。 1. **CString to char\***: `CString`是MFC库中的一个类,用于处理字符...

    VC++知识学习

    在Windows编程中,我们经常需要在不同的字符串类型之间转换,例如char和wchar_t,或者使用MFC库中的CString类。转换过程是重要的,因为它确保了代码能在不同编码和字符集下正确工作。“VC字符串转换”这部分可能涵盖...

Global site tag (gtag.js) - Google Analytics