C++数据类型问题,wchar_t和char;size_t

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++数据类型问题,wchar_t和char;size_t相关的知识,希望对你有一定的参考价值。

wchar_t和char区别是什么,各用到什么场合?
size_t是什么类型,用到什么场合?和int、short int区别是什么?

wchar_t 是双字节字符, char 是单字节字符。 一般来说wchar_t几乎总是可以取代char(除非这个地方就是需要一个8位的东西)。 当然 wchar_t要比char 多占用一倍的内存空间。 一般来说vc下编程多半是用 TCHAR 类型, 根据编译器选项自动define成 wchar_t或者char

size_t你就当它是个整数就行了

short int 是16位整数,long int是32位整数 , long long 是64位整数 。 当然根据c流传下来的规则, int可以不写(就是说 short 和 short int是一样的)
int的长度跟编译器有关系, 原则上说int应该是当前平台下处理最快的那种整数类型。 在vc下int是32位整数
参考技术A 这篇文章应该可以解决你的疑问 还有哦 我在stl学习中碰到了size_t这个类型 它是可以存放足够大小的下标用的 一般用了这个类型就不用考虑越界什么的了

TCHAR根据预定义情况,可以是char和wchar_t中的一种,不再是什么特殊类型。

char是个8位一个字节的正数,也就是首位为0;
char型可以读写汉字,但由于汉字需要2个字节来表示,因此实际操作时有很多不便之处.
缺点如下:
1 引用字符数组中的汉字不方便.
如 char ch[]="真不方便";
引用中的"真",不可以用ch[0]来引用,这样只有半个字节,而且是负数,显示"?";
2 中间读写不方便.
依照愚见,要我把上述数组中的'不'改成'是'的话,我要采用这个笨方法:
char temp[]="是";
ch[2]=temp[0];ch[3]=temp[1];
读我也这么读.
3 查找不方便.查找指定汉字的话,由于汉字不是单一字节字符,所以要每个比较2次;
不可以用STL中find算法了,但可以用子串匹配算法seach.但同样有很多麻烦事情要做.
4 当有asc码去替换汉字时候,由于一个字节要替换2个字节的位置,因此要多个空位,怎么办?
当然,不介意的话可以用空格补充.但注意,标准输入函数对于常量字符串常常忽略空格,这样你还得注意这个方面.
不幸的事情马上发生,用汉字去替代普通的ascII码,怎么办?你不得不把所有的字符向后移动一个位置.如果碰巧这是个常量字符串,就会出现数组越界的问题.
5统计字符数目是个头痛的问题.当汉字与asc码交错出现的时候,你用strlen或者.size()得到值仅仅是个数量上的,实际上,谁会把在数汉字的时候,一个算2个呢?
为此必须计算总体字符数,还有字符为负的字符数,然后 实际字数=总体-负数/2;

唯一值得一提的是,对于全部直接读写没有任何问题,cout自动就能正确的写出汉字来.这一点比起wchar_t,我想是最大的优点了.

c++标准中规定,wchar_t的实现根据具体编译器而定.这就是说,wchar_t不一定是个什么东西呢.
但wchar_t是一个short型的整数,16位,2字节,这个是没有错的.
定义一个wchar_t变量的方法如下:
wchar_t p[]=L"这个是宽字符~~!";//加上一个标示符L,表示long
用sizeof(p[0]),发现值等于2;说明确实是2个字节的.对于普通asc码拓展方式为,
如 a 为65,拓展为 65 00(非16进制,只是简单描述下);
因此
wchar_t p[]=L"admin~~!";
strlen((char*)p)=1;因为a的后面有休止符0了.
对于宽字符的结束符为00 00;
讨论asc码的宽字符没有啥意义,关键是讨论汉字的宽字符.

wchar_t p[]=L"这个是宽字符~~!";
对于汉字的wchar_t实现是怎么样的呢?汉字已经是2个字节了,就不用补一个字节的零位了.是么?
c++标准中规定,wchar_t的实现根据具体编译器而定.这就是说,wchar_t不一定是个什么东西呢.
按照我用的dev-c++4.9.9.2结果确实是不用再扩充零位了.
为了编译成功,我在编译选项中添加了: -finput-charset=GB2312
#include<iostream>
using namespace std;
int main()

wchar_t p[]=L"啊shi";
char q[3];
q[1]=(p[0]+32896)>>8;
q[0]=(p[0]+32896)&255;
q[2]='\0';
char qq[]="啊";
cout<<"p[0]="<<p[0]<<" ( p[1]="<<p[1]<<" p[2]="<<p[2]<<endl;
cout<<"p="<<(char*)p<<endl;
cout<<"q[0]="<<(int)q[0]<<" q[1]="<<(int)q[1]<<" q[2]="<<(int)q[2]<<endl;
cout<<"q="<<q<<endl;
cout<<"qq[0]="<<(int)qq[0]<<" qq[1]="<<(int)qq[1]<<" qq[2]="<<(int)qq[2]<<endl;
cout<<"qq="<<qq<<endl;

cout<<strlen((char*)p)<<endl;
cout<<"p[0]长度="<<sizeof(p[0])<<endl;
cout<<"p[1]长度="<<sizeof(p[1])<<endl;
int a;
cin>>a;
return 0;

运行结果如下
p[0]=21834 ( p[1]=115 p[2]=104
p=JUs
q[0]=-54 q[1]=-43 q[2]=0
q=收
qq[0]=-80 qq[1]=-95 qq[2]=0
qq=啊
3
p[0]长度=2
p[1]长度=2
可以发现的就是:
1 'J'=74,'U'=85,21834=85*256+74;而p[0]=74,p[1]=85,这个顺序值得注意.
2 宽字符和char汉字编码不一样啊,由
q[0]=-54 q[1]=-43 q[2]=0
q=收
qq[0]=-80 qq[1]=-95 qq[2]=0
qq=啊
可以看出,同时也不一定为负.J,U都是正数啊.用的是UFT_8码
但同时有人指出(参看参考资料),有时候编译器实现把汉字扩充为4个字节
比如 "啊",应该为 74 85 ,但扩充为74 00 85 00,据说是 Dev-CPP4990 版本.我和他就差2个小版本号,差距有这么大么?
汗了~~
然后说下输入输出问题.
用cout<<p;结果输出了p的地址;
据说用wcout可以,结果不能编译(dev-c++4.9.9.2),对于其他的,还得使用wchar_t特有的版本函数.这里就更乱了.改日探索清楚再说.
还有许多标准string只支持char,同样引发很多麻烦呢.
对于这些麻烦,我觉得甚至不能完成任务了;而char,尽管怎么麻烦,还是可以的.所以,我还是决定先只用char了.
还有其他很多问题尚待解决.

在vc.net2005中,用w_chart完全可以胜任汉字的任务,我已经验证过了。在dev-c++中还有一些困难,导致2者很多不兼容的地方
参考技术B wchar_t表示unicode字符类型,一个字符占两字节,char则是ASCII码类型,一个字符占一字节.很显然,分别是用在Unicode和ASCII编程环境下.

size_t 就是unsigned int,一般用来表示数组中元素的个数吧.

int与short int是不一样的。C++标准规定,int占一个机器字长。在32位系统中int占32位,也就是4个字节,而在老式的16位系统中,int占16位,即2个字节。而C++标准中只限制规定short int不能超过int的长度,具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。其中short int可以简写为short。类似地,C++标准只限制了long int不得小于int的长度,具体也没有作出限制。
参考技术C wchar是宽字节的字符类型,支持unicode,中文就要用这个
char是asicil字符类型

size_t是用typedef定义的类型,一般用在STL里用来计数,和int差不多
类型可以用typedef来定义,如你可以定义typedef char CHAR;然后写编程时,就可以使用CHAR类型和使用char类型就是一样的,所以在写大型程序时,一般都用typedef定义很直观,

C++中字符三兄弟(WCHARCHARTCHAR)

目录

前言

一、与字符集的关系

二、代码实例

三、常见宏


前言

众所周知,C++中的字符分成两种类型:wchar_t和char。其中,WCHAR 对应 wchar_t,CHAR 对应 char,TCHAR 是一种条件编译的类型,根据条件动态代表 wchar_t 或者 char。

一、与字符集的关系

其实,它们三者和对应的字符集相关。C语言用 char 来表示一个8位 ANSI 字符,用wchar_t表示一个16位的Unicode字符。strlen返回一个ANSI字符串的长度,wcslen返回一个Unicode字符串的长度。

其中,ANSI 是单字节字符集,每个字符占一个字节,最多表示256个符号;Unicode 是双字节字符集,每个字符占两个字节;

char表示一个ANSI字符。

wchar_t表示一个Unicode字符。

std::string表示一个ANSI字符串。

std::wstring表示一个Unicode字符串。

二、代码实例

为了便于理解,此处看一段代码实例:

WINBASEAPI
BOOL
WINAPI
FillConsoleOutputCharacterA(
    _In_ HANDLE hConsoleOutput,
    _In_ CHAR cCharacter,
    _In_ DWORD nLength,
    _In_ COORD dwWriteCoord,
    _Out_ LPDWORD lpNumberOfCharsWritten
    );

WINBASEAPI
BOOL
WINAPI
FillConsoleOutputCharacterW(
    _In_ HANDLE hConsoleOutput,
    _In_ WCHAR cCharacter,
    _In_ DWORD nLength,
    _In_ COORD dwWriteCoord,
    _Out_ LPDWORD lpNumberOfCharsWritten
    );

#ifdef UNICODE
#define FillConsoleOutputCharacter  FillConsoleOutputCharacterW
#else
#define FillConsoleOutputCharacter  FillConsoleOutputCharacterA
#endif // !UNICODE

上述代码,根据是否支持 UNICODE 字符集,FillConsoleOutputCharacter方法对应不同的两种实现,分别是FillConsoleOutputCharacterW和FillConsoleOutputCharacterA。

三、常见宏

常见宏对应的具体的数据类型:

LPSTR – char*

LPWSTR – wchar_t*

LPTSTR – char* 或 wchar_t*

LPCSTR – const char*

LPCWSTR – const wchar_t*

LPCTSTR – const wchar_t* 或 const char*

作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!😄

以上是关于C++数据类型问题,wchar_t和char;size_t的主要内容,如果未能解决你的问题,请参考以下文章

C++搞懂char与wchar_t字符串

C++ 几种字符类型学习

C++中char和wchar_t转换

C++中字符三兄弟(WCHARCHARTCHAR)

C++中字符三兄弟(WCHARCHARTCHAR)

❥关于C++之ASCII/Unicode/ISO10646及wchar_t/char16_t/char32_t