C++字符串

字符串变量与常量

字符串变量

  • 字符串是一个特殊的字符数组,以空字符\0结尾
  • 空字符\0自动添加到字符串的内部表示中
  • 在声明字符串变量的时候,要时刻记得为这个空结束符预留一个额外元素的空间:char str[11] = {“helloworld”},十个字符要留11个位置

字符串常量

  • 字符串常量就是一对双引号括起来的字符序列:“helloworld”
  • 字符串中的每个元素作为一个数组元素访问
  • 字符串常量也是以’\0’结尾的

ASCII码表

ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。
常用的ASCII码:0x41(65)对应’A’,0x30(48)对应’0’,0x61(97)对应’a’,0x7F(127)对应DEL

Unicode编码

ASCII码能表示的字符太少了,Unicode最初的目的就是把世界上的文字都映射到一套字符空间
三种Unicode编码方式:

  1. UTF-8:1byte来表示字符,可以兼容ASCII码,但是和ASCII码一样并不能表示汉字等字符。特点是存储效率高,可变长(不方便内部随机访问),无字节序列问题(可以作为外部编码)
  2. UTF-16:2byte表示一个字符。字符变为2byte后可以表示的字符变大了,特点是定长(方便内部随机访问),但是因为一个字符2byte,会涉及到字符序列是大端还是小端的问题(不可作为外部编码)
  3. UTF-32:4bytes表示一个字符,能表示的范围更大了,但是和UTF-16特点相同,定长,但有字节序列问题。而且因为一个字符存储空间太大,会浪费大量内存空间。

Windows的文件可能有BOM(byte order mark),如果要在其他平台使用,可以去掉BOM。

写程序中我们经常会发现编码的错误,根本原因就在于编码方式和解码方式不一致。

字符串的指针表示

char* pStrHelloWorld = "helloworld";

表示一个char型的指针变量,指向内存中一个存储字符串“helloworld”的地址。

定义字符串的两种方式,char[]和char*,要有以下两个概念:

  • 地址本身和地址存储的信息;
  • 可变与不可变;
char strHello[11] = {"helloworld"};
//strHello是数组变量,它本身的值是不允许改变的,但是它指向的区域的值strHello[index]是可以改变的


//ptrHello是指针变量,它本身是可以改变的,但是ptrHello[index]指向的值可变与否要取绝与所指向的区间是否可以改变
char* ptrHello = "helloworld";  //指针指向常量区,ptrHello[index]不可改变
char* ptrHello = strHello;      //指针指向数组变量,ptrHello[index]可以改变

字符串操作

头文件:string.h

字符串长度

strlen(s);    //返回字符串s的长度,要注意字符串的长度不包含'\0'。

sizeof(s);   //返回字符串所占用的空间,包含'\0'

字符串比较

strcmp(s1,s2); 
//s1 == s2,返回0
//s1 < s2 ,返回值小于0
//s1 > s2 ,返回值大于0

两个字符串自左向右逐个字符相比,按照ASCII值大小来比较,直到出现不同字符或遇到’\0’为止

字符串拷贝

strcpy(s1,s2);   //赋值字符串s2到字符串s1

要注意一个陷阱,一定要保证字符串s1的内存大小能存的下s2的大小

赋值字符串指定长度

strncpy(s1,s2,n);   //将字符串s2中的前n个字符拷贝到s1中

和字符串拷贝一样,要注意s1的内存空间一定要足够存放s2

字符串拼接

strcat(s1,s2);   //将字符串s2拼接到s1后面

这个更加要注意,s1的大小要足够存放拼接后的字符串的大小
两个字符串指针不能直接相加,必须要用这个函数。(指针相加是什么操作啊(#`O′))

字符串查找

strchr(s1,ch);   //指向字符串s1中字符ch第一次出现的位置
strstr(s1,s2);   //指向字符串s1中字符串s2的第一次出现的位置

安全版本的API函数

以上程序都需要我们进行边界检查以防止内存问题。现在我们往往在程序中使用更加安全的API函数

上述所有API函数都有其_s版本,如strcpy_s(),在执行操作的同时要告诉系统当前可使用的缓冲区的大小。
strlen()的安全版本是strnlen_s(),传入字符串的同时要传入一个最大的边界,以防止某些字符串没有\0结束标志 。

字符串操作中需要避免的问题

  1. C原始字符串的操作在安全性和效率中存在一定问题:
    1. 一定要注意不要缓冲区溢出。
    2. strlen的效率可以提升,当字符串很长的时候strlen的效率不高,我们可以用空间换时间,在定义字符串的时候用变量记住它的长度,不使用strlen函数来计算
  2. 目前有一个很好的开源库Redis字符串:Redis库

新型字符串——string

C++标准库中提供了string类型专门表示字符串

#include<string>
using namespace std;

使用string可以更加方便和安全的管理字符串,对性能要求不是特别高的场景可以使用。

定义字符串变量

string s;   //定义空字符串
string s = "helloworld";  //定义并初始化
string s("helloworld");
string s = string("helloworld");

获取字符串长度

cout<<s1.length()<<endl;    //输出字符串长度
cout<<s1.size()<<endl;      //本质和上面一样
cout<<s1.capacity()<<endl;  // 字符串的容量

字符串比较

直接使用== != > >= <=即可,比较ASCII码来比较。

转换为C风隔的字符串

const char* c_str1 = s1.c_str();

随机访问

字符串本身可以使用下标的方式访问

string s = "hello";
cout<<s[0]<<endl;

字符串拷贝

不需要使用函数,直接使用=赋值

string s1 = "hello";
string s2 = s1;

字符串连接

string重载了+和+=,不需要使用函数

string s1 = "hell0",s2 = "world";
string s3 = s1+s2;
s1 += s2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值