CString向char类型转化 ---“=”: 无法从“wchar_t *”转换为“char *
此文从网上复制过来,原文出处已丢失,望见谅哈
VC 2005中,这个本来很简单的问题又稍微复杂了一点。
在工程里面,一个必不可少的步骤就是把CString转换为shar*字符串。通过google,我发现可以使用以下方法:
使用CString的GetBuffer方法
CString s("Hello,World");
char* c = s.GetBuffer(0);
但是我在VC++2005中编译得到下列信息
error C2440: “初始化”: 无法从“wchar_t *”转换为“char *”
对于这个错误不是很理解,对于wchar_t和char的区别不是很清楚,在MSDN中查看了一下,wchar_t是一个宽字符型,相当于unsigned short(16bit)。而我们通常使用的char是8bit。继续搜索wchar_t*到char*的转换,msdn上面有一篇文章是Convert Between Various String Types,讲了VC++2005中的各种字符串char *, wchar_t*, _bstr_t, CComBSTR, CString, basic_string, and System.String的相互转换。其中将wchar_t*转换为char*的代码如下:(为了保持文章的一致性,修改了变量名)
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
wchar_t *s = L"Hello,World";
wcout << s << endl;
// Convert to a char*
size_t s0 = wcslen(s) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char c[newsize];
wcstombs_s(&convertedChars, c, s0, s , _TRUNCATE);
cout << c << 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中选择not set,这样,开头的那段代码就可以正确的执行了。这样就省下了一箩筐的问题。
CString向char类型转化 ---“=”: 无法从“wchar_t *”转换为“char *的更多相关文章
- Error:“const char*”类型的实参与“wchar_t”类型的形参不兼容
MainApp\RPolarView.cpp(1571): error C2664: “ATL::CStringT<BaseType,StringTraits>::ReverseFind” ...
- vs2017中char* str = "1234asd56";会报错,——const char*类型的值不能用于初始化char*类型的实体
原因: "1234asd56"是常量 ,正确的写法本身就是:const char* str = "1234asd56"; 之所以之前的vs版本可以写成char* ...
- "const char *" 类型的值不能用于初始化 "char *" 类型的实体
用vs2019发现会出现这样的问题 最后发现只要设置一下就解决了,解决方案如下: 右击该项目,选择属性->c/c++->语言->将符合模式改为否就行了... 设置之后程序没有再报错, ...
- JAVA中的char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- C++中char类型的溢出问题
C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环.这里我们就来简单介绍下为什么会出现这种情况. 首先,了解下char类 ...
- C++中“wchar_t* ”和“ char * ”之间的相互转换
把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法: char *CStr = "string to convert" ...
- 加深关于Java中char类型的理解
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- JAVA数据类型中的char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=11 ...
随机推荐
- throws与throw的对比
1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.如下面例子所示:public cla ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- C# 中 datagridview 绑定BindingList类型和更新
C# 中的datagridview是一个非常有用且强大的控件,可以用来绑定数据库.绑定LIST类型的变量等等. 这里我们说一说绑定List类型并实时更新datagridview的情况.实时更新,指的是 ...
- 追访现代主流程序员的家庭事业观---禅宗派程序员KUROKY
Kuroky,一个被人遗忘的当代主流程序员. 在他的内心深处有着怎样的心路历程 他的快乐与悲伤,都是一个禅 独家专访kuroky: 记者:作为现代主流程序员,你内心的苦楚玉欢乐通过什么来发现? 大师: ...
- OpenStack 加入新的节点,创建虚拟机失败的问题
最开始做OpenStack的时候,由于只是为了部署测试用,因此将所有的部分都装在一台单网卡的机器上,费了九牛二虎之力终于部署成功,其中最主要的两块问题出现在以下两个方面: 1:nova.neutron ...
- 解决IE6下固定定位问题 使用position:fixed
IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法. 如果我们需要做某个元素始终位于浏览器的底部,不会因为浏览器窗口的缩 ...
- (转)Yale CAS + .net Client 实现 SSO(4)
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 1.下载 Microsoft JDBC ...
- 3月3日 Mark
感觉LeetCode OJ 水题较多... 不过回复基础就是这样吧.. 刚刚和Gaewah聊了下,后续可以考虑去做Topcoder的SRM或者codeforces,Mark.
- Linux多命令协作:管道及重定向
- 【Qt】Qt之进程间通信(Windows消息)【转】
简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...