【转】VC中的字符串处理
http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727
貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的个人心得总结一下。
首先,char是ascii编码,wchar_t是unicode,这是大家都知道的,但是这也是纠结所在。所以个人经验,在做windows程序时,最好是忘记这两种变量的存在,而记住windows里只有一种字符变量,那就是TCHAR。(虽然TCHAR只不过是对char或tchar的宏定义而已)
也就是说,程序里既不要出现char也不要出现wchar,只能出现TCHAR,这样就把纠结统一起来了。这也是程序通用性的要求。
接下来,还必须注意以下几点:
1、既然程序里不能出现char,那表示字符串时,就不能再习惯性的用char*了。应该改为TCHAR*,或者是PTSTR。后一种是windows的变量,类似的有:PSTR、PTSTR、LPTSTR、LPSTR、PCTSTR等等等等。这也是让人一开始接触会头大的地方。其实并非如此恐怖,我以PCTSTR为例做个解释:P代表指针(和LP是一个东西,LP的本意是Long Pointer,16位windows时代的遗留物。),C代表const,T代表TCHAR,STR代表字符串。所以PCTSTR其实就是const TCHAR* 的意思。而PSTR也就是char* 的意思。所以我们在表示字符串时也不能使用PSTR等不带T的变量类型名。
2、表示字符串常量时,不能简单的用双引号括起来,因为那代表ascii字符串。同样也不能在前面加L,因为那代表unicode。我们的程序要做到的是通用性,即不是ascii也不是unicode。所以我们在字符串前应该加的是TEXT, 比如MessageBox(NULL, TEXT("Fypher"), TEXT("Fypher"), MB_OK)。TEXT还可用于字符。比如TCHAR m=TEXT('A');
3、TCHAR tchTest[50]。tchTest能装多少字符?哈!不要习惯性的sizeof(tchTest)了,应该_countof(tchTest)或者sizeof(tchTest)/sizeof(TCHAR)。因为我们不确定TCHAR到底是char 还是 wchar_t。
4、该和一堆老朋友说再见了……我们不能再使用以前的字符串处理函数或者字符处理函数了。比如strlen、strcat、strcmp等等等等……因为这些是ascii专用的,通通改成使用T家族的吧。前缀都换成_tcs。比如_tcslen、_tcscat、_tcscmp等等……顺便补充一下wcs前缀是wchar_t使用的。恩,还有大家用得超爽的sprintf,今后就改成_stprintf了吧~呵呵。补充:swprintf是wchar_t它家的。对了,windows认为_tcscpy、_tcscat等不安全,所以使用这些函数编译器会报警。可以改用windows推出的_tcscpy_s、_tcscat_s等“安全”函数,其实就是多了个参数用来指明缓冲区大小(记得用_countof哦!^_^)。windows还推出了形如StringCchCat的一套字符串处理函数,我没怎么用过。windows也有一个字符串比较函数CompareString。功能比_tcscmp强大多了。比如可以设置忽略大小写等。
5、IsTextUnicode函数可以用过一系列统计学的方法判断某个字符串是不是unicode字符串。MultiByteToWideChar和WideCharToMultiByte函数可实现Ascii和Unicode字符串的相互转化。这些的使用场合都不大。因为我们的程序应该做到“没有”ascii和unicode。
6、恩,虽然绝大多数情况下应该使用TCHAR,但是记住GetProcAdress这个特殊的函数吧,它的参数只能是char*。因为在导出函数表里函数名是用ascii码写的……
7、最后一点,记得要#include <tchar.h>,呵呵。 由于windows内核采用的是UNICODE,UNICODE版的程序必然比ASCII版的程序效率高(比如不用在调用函数时在堆里分配空间把参数转成UNICODE,然后再调用UNICODE版的函数),所以我们最好是在程序的开头加上#define UNICODE和#define _UNICODE,把程序转换成UNICODE版的。如果程序的字符串处理完全按照上面的通用性要求做了是不会出错的。
恩,就这些了,呵呵。
【转】VC中的字符串处理的更多相关文章
- VC中的字符串转换宏
ATL7.0引入了几个新的转换类和宏,现有的宏提供了显着的改善.新的字符串转换类和宏的名称,采取的形式如下: C SourceType [C]DestinationType[EX] ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...
- DB2 VC++ 中连接字符串
根据你安装的驱动,有如下两种连接字符串形式.Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=xxx.xxx.xxx. ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)
一. 在字符串前加一个L作用: 如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节. strlen("as ...
- VC++ 中使用 std::string 转换字符串编码
目录 第1章说明 1 1.1 代码 1 1.2 使用 4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...
- VC++编程之字符串解惑--Unicode & MBCS
VC++中的字符串用起来着实让人难受,LPTSTR.LPCTSTR.LPCSTR.LPCWSTR.LPSTR.WCHAR.CString._T()和L彼此之间的互相转换更是头痛.根据使用经验和MSDN ...
- VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)
转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用: ...
- 【thrift】vc中使用thrift中文字符串乱码问题解决
问题描述: VC中使用Apache thrift时,如果字符串中包含中文,会出现乱码问题,这个问题的原因是由于thrift为了达到跨语言交互而使用了UTF-8格式发送字符串,这点对java或者C#不会 ...
- VC++中开发汇编语言(转)
汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...
随机推荐
- SVM学习笔记(二):什么是交叉验证
交叉验证:拟合的好,同时预测也要准确 我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤.{A1,A2,A3,A4,A5,A6,A7,A8,A9} 为了简化,取 ...
- Http协议的常见参数
Requests部分 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字 ...
- en_windows_10_multiple_editions_version_1511_x64.iso
好久没折腾电脑了,这几天在E盘装了个64位Windows 10 TH2 专业版,从MSDN官网下载的英文原版镜像,用kms10未能激活,一看日志文件,说我这是零售版,后面就关掉了什么监听端口,然后就完 ...
- .net stream
流的抽象基类Stream:Stream 是所有流的抽象基类.流是字节序列的抽象概念,例如文件.输入/输出设备.内部进程通信管道或者 TCP/IP 套接字.Stream 类及其派生类提供这些不同类型的输 ...
- aa3
var geoCoordMap = { "海门":[121.15,31.89], "鄂尔多斯":[109.781327,39.608266], "招远 ...
- updateEasyuiTab
//tabContainer:easyui-tabs或者id,title名称 this.updateEasyuiTab = function (tabContainer, outTitle, outU ...
- Ip地址查询
$url = 'http://ip.taobao.com/service/getIpInfo.php?ip=115.239.211.112'; $info = file_get_contents($u ...
- sql server操作类(本人自己写的)
package com.mytest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepa ...
- sharebutton
<h1>Share Buttons</h1> <!-- Twitter --> <a href="http://twitter.com/share? ...
- 利用FPGA加速实现高性能计算
原文链接 原因:处理器本身无法满足高性能计算(HPC)应用软件的性能需求,导致需求和性能 之间出现了缺口. 最初解决办法:使用协处理器来提升处理器的性能. 协处理器(基于硬件的设计)具有三种能力: 1 ...