C++字符串常用操作

目录

概念

char型

初始化

拷贝

连接

多个字符串连接

strlen获得长度

sizeof获得长度

字符串比较

string型


概念

什么是字符,字符数组,字符指针,字符串,字符串指针

  • 字符:就是用单引号''标识的常量
char c = 'A'
  • 字符数组:是指用来存放字符的数组。其定义的一般形式为: char 数组名[数据长度] 。
char str[10];
  • 字符串:只有以'\0'结尾的字符集合才能称为字符串,双引号表示
"abcdef"

char str[10] = "abcdef";
字符数组里是一个字符串
  • 字符指针:是指向字符型数据的指针变量。 指针声明char *p请求一个位置放置一个指针,用名称“p”表示,这个指针几乎可以指向任何位置任何字符或者任何连续的字符,或者哪里也不指。
char *str="abcd"; 

char型

  • 初始化

1、定义的时候直接用字符串赋值

char a[10]="hello";   //sizeof(a)为10
char a[]="hello";  //sizeof(a)为6

注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!

2、对数组中字符逐个赋值

char a[10]={'h','e','l','l','o'}; //sizeof(a)为10
char a[]={'h','e','l','l','o'}; //sizeof(a)为5

字符串初始化用双引号,字符初始化用单引号

3、利用strcpy

char a[10];
strcpy(a, "hello");

4.定义指针类型

char *testChar = "Hello word";
  • 拷贝

  • memcpy拷贝
void *memcpy(void *dest, const void *src, size_t count);

内存拷贝不会对字符串结束符'\0'进行检查,拷贝结束后,在字符串末尾会出现乱码。所以申请内存时多申请一个字节内存,加上\0

  • strcpy拷贝
char *strcpy(char *dst, const char *src);//strcpy函数遇到'\0'将会停止;

之前在某处看到过这个问题,以下将对其进行详解,

· 最终答案输出是 "ABC\0";

· 为什么答案不是"ABC\0ef";strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符;

  • strncpy拷贝
char *strncpy(char *dest, const char *src, int len)

总的来说,strncpy总是复制src的len个字符到dst指向的内存!!!

如果strlen(src)的值小于len,dst数组就用额外的NULL字节填充到len长度

如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。注意!它的结果将不会以NULL字节结尾。(NULL即‘\0’).

使用这个函数,尤其需要注意,不要出现len>strlen(dst)的情况,如果len>strlen(dst),那么会破坏dst后面的内存:

我们假设前面红色部分是dst,然后strncpy(dst,src,10);那么后面黄色部分的内存就被破坏了。strncpy是不负责检测len是否大于dst长度的。

使用strncpy时,最好自动添加‘\0’在结尾:

  • 连接

char *strcat(char *strDestination, const char *strSource);

strcat() 函数把 strSource 所指向的字符串追加到 strDestination 所指向的字符串的结尾,所以必须要保证 strDestination 有足够的内存空间来容纳两个字符串,否则会导致溢出错误。

注意:strDestination 末尾的\0会被覆盖,strSource 末尾的\0会一起被复制过去,最终的字符串只有一个\0

  • 多个字符串连接

int sprintf( char *buffer, const char *format, [ argument] … );

int snprintf( char *buffer, size_t size, const char *format, [ argument] … );

因为sprintf可能导致缓冲区溢出问题而不被推荐使用,而snprintf通过提供缓冲区的可用大小传入参数来保证缓冲区的不溢出,如果超出缓冲区大小则进行截断。

  • 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0')
  • 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
  • strlen获得长度

unsigned int strlen(char *s);

计算字符串 str 的长度,直到空结束字符,但不包括空结束字符\0。

如果strlen()函数对一个未初始化数组的处理

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char a[3];
    printf("len = %d\n", strlen(a));
    return 0;
}

可以看到在内存的某处存在‘\0’,由于strlen会遇到‘\0’时才停止计算长度,所以算出来的长度并不是字符数组的真实长度,而且这个值是随机的。

这就告诉我们:

1.对数组使用strlen()时,要确保数组中有\0结束符

2.联想到strncpy等操作,如果按strlen后的长度复制字符串,要记得在结尾加个\0

3.strlen是函数,只能以char*(字符串)做参数

  • sizeof获得长度

sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。

sizeof是操作符,计算的是所占内存的实际长度,单位是字节,可用于常量,变量,数据类型,函数,sizeof是基于数据类型来计算长度的

char a[10]="hello";   

sizeof(a)为10,分配10个char型

strlen(a)为5

char a[]="hello";  

sizeof(a)为6,分配6和char型,其中最后一个是\0     

strlen(a)为5

char *ch = "adbc";

sizeof(ch)为4,因为ch是指针,只是指向了不同内容,sizeof这块指针,就是4个字节

strlen(ch)为3,是对内容计算长度

char *ch = "hello";

sizeof(ch)为4 strlen(ch)为5

  • 字符串比较

int strcmp(const char* str1,const char* str2);

strcmp() 会根据 ASCII 编码(大小写不敏感)依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0)。
返回值:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。

string型

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值