char与wchar_t字符串

article/2025/7/20 2:05:05

C++里的字符串类型是比较二的,因为有太多表示方法:char*、string、字符串数组、wchar_t*、wstring,今天就来缕一缕这些玩意。

  1. char*

char* 貌似是C++字符串最基础最核心的。

看以下四个字符串声明及输出结果:

 

先说说核心,C里面的字符串就是一连串内存,以内存为0的字节作为结尾。

来分析一下代码,其中str1、str3、str4是一个东西(str3区别只是内存在堆上),str2是字面值常量,str5是单纯的字符数组。

    1. 常规字符串

对于str1、str3、str4这种正常的字符串,就可以随意拿字符串函数和下标访问,进行各种操作。

在windows下,char*的字符串编码是多字节,用的本地编码,就是我们的GBK。linux下char*直接就是utf8,所以两个平台char*字符串直接交流是不行的。。。

    1. 字符数组

对于str5这种字符数组,因为末尾没有0,所以把他当作字符串直接输出就会有内存里其他数据,就出现了“烫”。。

当我们把字符数组里的某个位置改成0,就可以截断出一个字符串。比如以下代码,把第三个位置设置为0,然后就是字符串“ab”。

 

    1. 字面值

对于str2这种在写代码的时候就是一个常量,当你对这个数据的内存操作的时候就会报错。

比如直接修改str2的元素,ide环境就可以给你报错:

 

如果我们来硬的,运行的时候就会错误:

 

  1. wchar_t*

首先我们再敲一下重点:C里面的字符串就是一连串内存,以内存为0的字节作为结尾。

记住,这非常重要!!!

wchar_t*与char*字符串主要不同,那就是字符的编码而已。

先看下以下代码和输出:

 

“吃饭”这个字符串,用GBK编码后一共占了5个字节,其中4个字节是用来存放字符串内容的,最后末尾为0。

strlen这个函数,他是一个字节统计一次,出现0就停止,所以gbkstrlen就是4。

对于纯字母来说这没毛病,但对于中文来说,显然“吃饭”这是两个字符。

utf16是用unicode编码(全世界所有字符都有唯一一个数字表示),每个字符都用两个字节来存储unicode编码数字。

C++里utf16字符串需要用L开头,所以得写成  L"吃饭" 这种。

这时,我们用wcslen函数就可以计算出"吃饭"的长度是2。

哎,其实这也真的挺二的。。。因为简单来说utf16一定是每个字符2个字节,所以用strlen计算到末尾长度一定是2的倍数。除以2就肯定是实际长度了。

所以当我们用char* buf = (char*)utf16str;强转成char*然后用strlen计算出的utf16memlen就是4。

看一下内存里的情况,两个字符串都是占用4个字节,但是每个字节里存储的内容是不一样的。

 

其实C++里的wchar_t*挺鸡肋的感觉,现在utf8比较普遍。因为一刀切地用2个字节表示,对于纯英文字符那直接是浪费一倍的空间。所以utf8这种变长编码就比较合适。

utf8也是Unicode编码数字,就是根据每个字节前面的二进制位决定后面使用几个字节来表示一个unicode编码。

 

比如对于0到0x7F,因为第一个字节第一个位是0,所以后面不使用任何字节,就一个字节表示Unicode编码。

对于0x80-0x07FF,因为第一个字节0之前出现2个1,所以后面再使用两个字节(每个字节最前面都是10)。

我们用windowsAPI将wchar_t*字符串转utf8看下:

 

可以看出来用WideCharToMultiByte得出的内存占用大小和强制按照char*算出的utf8字符串的一样长。

对比看下,内存中和gbk与utf16的都不一样:

 

可惜的是VC++中没法显示utf8字符串,不过在linux下就用char*就够了,直接utf8。

  1. string和wstring

这俩就是char*和wchar_t*的封装,变成了类对象管理字符串。


http://chatgpt.dhexx.cn/article/5gJ9MHAE.shtml

相关文章

wchar_t的用法

wchar_t的解释可以看这里:这里 程序和解析: 1 # include<stdio.h>2 # include<stdlib.h>3 # include<locale.h>//设置本地化<

WCHAR的简单操作

WCHAR 是双字节类型&#xff0c;一般它用来存储那些双字节而不是单字节字符.较长的字节数可以支持 在应用程序的国际发布版本里所使用的扩展字符集(如常用的Unicode字符集). 比如说&#xff1a;在中文系统下开发的软件&#xff0c;当应用到日文操作系统时&#xff0c;如果没有采…

ADI Diff-Amp Calculator差分放大器件计算器使用方法

Diff-Amp Calculator便于计算单端转差分放大&#xff0c;差分转差分放大&#xff0c;在满足输入信号和输出信号的参数要求下&#xff0c;配置元件增益自动计算Rf和Rg阻值大小。 下载地址&#xff1a;https://www.analog.com/cn/design-center/interactive-design-tools/adi-dif…

双电阻差分电流采样_差分信号和差分电路讲解 差分放大电路应用

1、什么是差分信号?为什么要用差分信号? 两个芯片要通信,我们把它们用一根导线连接起来,一个传输 1,另一个接受 1,一个传输 0,另一个接受 0,不是很好吗?为什么还要搞其他的花花肠子。 因为有干扰,各种各样的干扰,比如温度,电磁辐射等等,这些干扰使得传输的 1 不再…

双电阻差分电流采样_差分放大电路的应用

差分运算放大电路,对共模信号得到有效抑制,而只对差分信号进行放大,因而得到广泛的应用。 1、如下图是差分电路的电路构型 目标处理电压:是采集处理电压,比如在系统中像母线电压的采集处理,还有像交流电压的采集处理等。 差分同相/反相分压电阻:为了得到适合运放处理的电…

全差分放大器(FDA)的基本知识

为了获得最佳性能&#xff0c;用户必须在信号链上选择一个balun(平衡不平衡变换器&#xff09;&#xff0c;虽然这可能会导致某些应用中的耦合问题。然而&#xff0c;耦合问题并不是总是发生&#xff0c;特别是在某些需要DC分量的测试和测量应用中更是如此。 全差分放大器 (FDA…

3.0.MATLAB版线性代数-矩阵加法、数乘、乘法、求逆

矩阵运算及其应用(加法、数乘、乘法、求逆) 加法数乘运算规则乘法矩阵乘法定义线性变换多次线性变换等于矩阵的连乘线性方程组看做矩阵乘法矩阵的转置矩阵的逆(“除法”)矩阵逆的定义矩阵逆的性质求逆矩阵的方法(求逆1)MATLAB中求逆矩阵的分块向量等式初等矩阵初等矩阵和…

算法:动态规划—矩阵链相乘

问题描述 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与A i1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少 解法 1.穷举法&#xff1a; 列举…

Java实现矩阵的加、减、乘、数乘、转置、幂运算

Java实现矩阵的加、减、乘、数乘、转置、幂运算 首先需要一个矩阵对应的类 Matrix. 命名为Matrix import java.util.Arrays; /*** author yiran* creat 2021-11-26-13:58*/ public class Matrix{// 矩阵private double[][] matrix;// m x n private int m;private int n;publ…

【数理知识】向量数乘,内积,外积,matlab代码实现

序号内容1【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现2【数理知识】矩阵普通乘积&#xff0c;哈达玛积&#xff0c;克罗内克积&#xff0c;点乘&#xff0c;点积&#xff0c;叉乘&#xff0c;matlab代码实现 文章目录 1. 向量基本形式2. …

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算 前言程序说明输出结果代码示例 前言 随着工业自动化、智能化的不断推进&#xff0c;机器视觉&#xff08;2D/3D&#xff09;在工业领域的应用和重要程度也同步激增&#xff08;识别、定位、抓取、测量&#xff0c;缺陷…

07-行向量列向量_向量的运算 加法,数乘,减法,转置

行向量和列向量 其实它们非常简单&#xff0c;所谓的行向量就是我们的向量表示&#xff0c;一组数这组数码成一行&#xff0c;那么所谓的列向量呢&#xff1f;就是这组数码成一列而已&#xff0c;那么对于行向量还是列向量&#xff0c;在我们的学习中是并没有区别的&#xff0…

矩阵相乘求解最小数乘次数

矩阵连乘问题&#xff1a; 给定n 个矩阵(A0,A1,....An-1) 其中 Ai 和 Ai1 是可乘的&#xff0c; i0, 1,... , n-2 . 求解计算这n 个矩阵的连乘积A0A1....An-1 。 由于矩阵连乘满足结合律&#xff0c;因此矩阵的乘法可以有多种不同的计算次序&#xff0c;每种计算次序对应不同…

人工智能数学基础-线性代数1:向量及向量加减法与数乘

☞ ░ 老猿Python博文目录░ 一、向量 1.1、向量定义 向量也称为欧几里得向量、几何向量、矢量&#xff0c;指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1…

线性代数-向量数乘、点乘意义

Vector 什么是向量基向量向量数乘向量的加法向量点乘 什么是向量 向量是指具有大小和方向的量。它可以形象化地表示为带箭头的线段 箭头所指&#xff1a;代表向量的方向 线段长度&#xff1a;代表向量的大小 向量是线性代数中最基础、最根源的组成部分&#xff0c;向量加法和…

C语言——矩阵计算(转置、加法、减法、数乘、乘法)

使用该计算器可以帮助你快速完成矩阵的简单计算。 #include <stdio.h> void menu() {printf("****************************************************************\n");printf("****************************************************************\n"…

各种乘法的区别 “点积、外积、数乘...等

Ive seen several conventions, including ⋅⋅, ∘∘, ∗∗, ⊗⊗, and ⊙⊙. However, most of these have overloaded meanings (see http://en.wikipedia.org/wiki/List_of_mathematical_symbols). Thus, in my personal experience, the best choice Ive found is: ⊙(\o…

06 ,矩阵的运算:加法运算,数乘,矩阵乘向量,矩阵相乘

1 &#xff0c;矩阵计算 &#xff1a; 加法运算 前提 &#xff1a; 必须同型矩阵之间才可以进行加法运算运算 &#xff1a; 两个 m * n 矩阵相加总结 &#xff1a; 对应元相加 2 &#xff0c;矩阵计算 &#xff1a; 数乘 计算规则 &#xff1a; 3 &#xff0c;矩阵计算 &…

7.进入线性代数的奇妙世界:向量的乘法之数乘

向量的乘法有3种&#xff0c;一是数乘&#xff0c;二是点积&#xff0c;三是叉积。听起来名称有点陌生&#xff0c;别急&#xff0c;接下来一一道来&#xff0c;先讲数乘。 数乘&#xff0c;就是用数字乘以一个向量&#xff0c;或用向量乘以一个数字&#xff0c;两者之间结果相…

【图像特征提取】基于脉冲耦合神经网络(PCNN)实现图像特征提取含Matlab源码

1 简介 脉冲耦合神经网络&#xff08;PCNN——Pulse Coupled Neural Network&#xff09;,由于其非常接近人类大脑的生物神经网络的特性&#xff0c;现已广泛应用在图像处理中&#xff0c;是一种重要的信息处理工具&#xff0c;具有优良的自适应图像分割和自适应特征提取能力。…