wchar_t类型理解

wchar_t(宽字符)类型

1、什么是wchar_t(宽字符)

char 类型通常只有 8 位,许多语言(如中文、日文、韩文等)的字符集包含的字符数目远超过 256 个,因此 char 类型无法直接表示这些字符。其大小通常为 16 位或 32 位(具体取决于编译器和平台),wchar_t 能够表示更多的字符。

2、赋值方法

前面多一个大写的L,说明是按照宽字符来存储(一个字符占两个字节)

#include<iostream>
using namespace std;
wchar_t ch = L'A';  // 声明一个宽字符变量并初始化为 'A'  
wchar_t str[] = L"Hello,World!";  // 声明一个宽字符数组并初始化为 "Hello, World!"

3、输出方法

使用wcout输出宽字符

wcout << ch << endl;
wcout << str << endl;

4、遇到问题wcout和cout不能同时显示

#include <iostream>
#include <string>
using namespace std;
int main()
{
    wchar_t ch = L'A';  
    wchar_t *str = L"Hello,World!"; 
    wcout << ch << endl;
    wcout << str << endl;

    cout << 2 << endl;
    cout << 1 << endl;
    return 0;
}

此处可以发现,wcout输出的显示了,cout输出的没有显示

问题出现在 wcout和cout 可能共享相同的底层缓冲区,而wcout的输出可能会改变该缓冲区的某些状态,这可能会影响到cout的输出。

解决方法:

1、避免混合使用wcout和cout。这不是一个必须遵循的规则,但在某些情况下,避免混合使用wcout和cout可能会减少潜在的问题。

2、使用std::cerr。尝试使用std::cerr而不是std::cout来输出调试信息。std::cerr通常不经过缓冲,因此可以立即看到输出。

4、求长度方法

使用wcslen()函数,在头文件< cwchar >中

#include <iostream> 
#include <cwchar>    //包含了wcslen函数
using namespace std;
int main()
{
    wchar_t str[] = L"Hello,World!"; 
    wcout << str << endl;

    size_t length = std::wcslen(str);   //std::wcslen 获取长度  
    wcout << sizeof(str) << endl;
    wcout << length << endl;
    return 0;
}

此处需要注意的是wcslen()返回值是size_t,而不是int。size_t的大小会根据平台和编译器而变化,以确保它能够存储任何对象的大小。

5、设置中文环境

需要引入头文件locale,使用setlocale(LC_ALL, "chs")设置为中文环境
使用wcout.clear()函数清除流错误,可以正常输出

6、常见宽字符处理函数

//1、求长度
wcslen(const wchar_t *ws);
//功能:返回字符串的长度(不包括终止符)
//返回值: size_t类型。

//2、复制字符串
wcscpy(wchar_t *dest, const wchar_t *src);
//功能:接受两个指向宽字符字符串的指针,并将 src 指向的字符串复制到 dest 指向的内存位置。
//返回值:返回 dest 的指针(wchar_t* 类型)。

//3、连接字符串
wcscat(wchar_t *dest, const wchar_t *src);
//功能:接受两个指向宽字符字符串的指针,并将 src 指向的字符串追加到 dest 指向的字符串的末尾。
//返回值:返回dest 的指针(wchar_t* 类型)。

//4、判断相等
wcscmp(const wchar_t *ws1, const wchar_t *ws2);
//功能:接受两个指向宽字符字符串的指针,并比较这两个字符串。如果相等则返回0,否则返回非0值。
//返回值:返回类型为 int。

//5、找子串
wcsstr(const wchar_t *ws1, const wchar_t *ws2);
//接受两个指向宽字符字符串的指针,并在 ws1 中查找 ws2 第一次出现的位置。如果找到则返回指向该位置的指针,否则返回 NULL(const wchar_t* 类型)。

posted @ 2024-05-06 09:05  baobaobashi  阅读(285)  评论(0编辑  收藏  举报