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* 类型)。
标签:字符,const,cout,字符串,理解,wcout,类型,wchar
From: https://www.cnblogs.com/baobaobashi/p/18171926