C/C++字符串处理

C语言字符串

定义字符串

char 字符数组名[常量表达式] ;
例如:
char s[20];

初始化

char s[6] = {‘h’,‘e’,‘l’,‘l’,‘o’} //字符串初始化
char s[6] = “hello” //也可以

结尾

char 类型的字符串以’\0’结尾
实际上char 类型的字符串数组比我们看到的要大
实际上char 类型的字符串数组比我们看到的要大

C++字符串处理函数

注意,使用这些函数,需要包含一个头文件

#incluede <string.h>

1、字符串复制函数strcpy

char s1[]= "ABC",s2 = "123";
strcpy(s1,s2);    //将字符串s2的值复制到s1中,s2的值不会改变  
//完成后s1 = "123"

2、字符串复制函数strncpy

char s1[]= "ABC",s2 = "123";
strncpy(s1,s2,2); //包含三个参数,将s2的前n个字符复制到s1中
//完成后s1 = "12"

3、字符串连接函数strcat

char s1[]= "ABC",s2 = "123";
strcat (s1,s2);       //将s2连接到s1末尾,而不会改变s2的值
//完成后,s1 = "ABC123" , s2 = "123";

4、字符串连接函数strncat

char s1[]= "ABC",s2 = "123456789";
strncat (s1,s2,5);       //将s2的前n个字符连接到s1末尾,而不会改变s2的值
//完成后,s1 = "ABC12345" , s2 = "123456789";

5、字符串比较函数 strcmp

char s1[] = "ABC" ,s2[] = "abc" ;
strcmp(s1,s2); //实际上是逐位比较两个字符串的ASCII码
/*
如果s1的ASCII码比s2的要大,则返回1  
如果两个字符串相等,则返回0
如果s1的ASCII码比s2的要小,则返回-1 
*/

6、计算字符串的长度

char s1[] = "abc", s2[] = "ABC";
int n = strlen(s1)      // n = 3

7、字符串转数值

f = atof("123.456") //f = 123.456
num = atof("123456") //num = 123456

8、查找字符串 strstr

char s1[] = "abc", s2[] = "ABC";
char *res = strstr(s1,s2); //返回s1中首次出现s2的地址,

C语言字符串的输出

1、标准输出方式

char S1[20] ;
gets(S1); //为S1赋值
puts(S1); //输出S1

2、输出输入流

char S2[20];
cin >> S2;   //为S2赋值
cout << S2;  //输出S2

C++中独有的string类

string类字符串采用动态内存管理,没有字符数组的概念,取消掉了字符数组长度是固定值的缺点(创建的时候要预留额外的空间来保证能够进行后续的操作);并且string类可以监测如越界之类的问题,我们知道,在char字符串中,越界问题是很严重的。
最重要的是string字符串中封装了很多函数,完全可以代替C语言中的字符串函数,并且可以直接用运算符来进行操作(如“+” ,“-” ,“*” ,“/“的操作,个人感觉和Python是有一定的相似性的)

string相关知识

预处理

包含一个头文件

#include<string>//注意不是string.h

字符串的定义及其初始化

string str1;         //定义一个字符串
string sx,sy,sz;      //同时定义多个字符串
string s11 = "123456";    //对字符串进行赋值操作
string s1("Hello World");   //对字符串进行初始化
/*后两种方式都可以对字符串进行初始化,并没有实际性的差异*/
char  c1[20] = "Hello World";
str1 = c1;//将C风格的字符串赋值给C++风格的字符串
string sa(c1);//也可以在初始化的时候进行赋值
/*后面会有将string转成char的函数*/

并且string类的字符串是不需要末尾的’\0’的

string类的字符串函数!!

两种字符串之间的相互转换

1、C风格转C++风格

string str1 = "ABCDEFG";//C语言的字符串可以直接转换成C++风格的字符串

2、C++风格转C风格
使用string的成员函数str1.c_str()

string str1 = "hello world";
const char *p = str1.c_str();  //const不能省去!!!!
for (i = 0; i < str1.length(); i++)
{
	cout << p[i];  //hello world
}

或者可以使用str1.copy()函数

string str1 = "abcdefg";
char S1[20];
str1.copy(S1,n,pos);//将str1中从pos开始的n个字符复制到字符数组S1中
赋值

str1.assign()函数

str1.assign(S1,n);//将C风格的字符串S1的前n个替换到str1中
运算符

string类可以使用 + 和+= 来实现连接字符串

string str1 = "12" ,str2 = "34" ,str3 = "56";
 str1 = str2 + str3 ;  //可以直接相加 str1结果为"3456"
 str1 = str2 + "ABC" ; //也可以  str1结果为"34ABC"
 str1 += str3;  // str1结果为"1256"

可一使用关系运算符进行比较

str1 = "ABC" ,str2 = "abc";
str1 > str2 ; //结果为假 
str1 == str2 ;//结果为假
str1 == "ABC";//结果为真
其他常用重要操作

1、计算字符串的长度

string str1 = "123456";
/*两个函数均可返回字符串的长度*/
int len1 = str1.size();   //注意size返回的是无符号的整数,所以一般用length会更好一点
int len2 = str1.length();

2、插入

	string str1 = "123456";
	str1.insert(pos1,str2,pos2,n);
	/*在pos1的位置插入str2中从pos2开始的n个字符
	其中,pos2可以省略,默认为从零开始;
		n可以省略,此时为插入str2的全部元素*/

3、删除

string str1 = "ABCDEFGHIJKLMN";
str1.erase(2/*bin*/,6/*len*/);//从下标为2的位置开始删除6个元素
/*
bin为开始下标,不可以省略
len为删除的长度,省略则表示删除bin之后的所有字符
*/

4、增添

string str1 = "ABCDEFG",str2 = "1234567";
str1.append(str2,2,4);//在str1后面增添str1中从2开始的4个字符

5、替换

string s1 = "abcdefghijklmnopq",s2 = "0123456789";
s1.replace(p0,n0 ,s2,p1,n1);
/*
删除s1中从p0开始的n0个元素,将s2中从p1开始的n1个元素插入到p0处
其中p1,n1均可省略
若省略p1,n1,则直接用s2替换s1中的值
*/

6、得到子字符串

string s1 = "abcdefghijklmnopq",s11;
s11 = s1.substr(pos,num);//从下标pos开始的num个字符

7、查找

string s1 = "abcdefghijkl",s2 = "cde";
int num1 = s1.find("cde",pos);//从pos开始寻找"cde"在s1中的位置,返回第一次出现的位置
int num2 = s1.rfind("cde" ,pos);//从pos开始逆序寻找"cde"在s1中的位置,返回第一次出现的位置
int num3 = s1.find_first_of(s2);//在s1中查找s2中任意一个字符第一次出现的位置
int num4 = s1.find_last_of(s2);//在s1中查找s2中任意一个字符最后一次出现的位置
int num5 = s1.find_first_not_of(s2);//在s1中查找第一个不在s2中的字符
int num6 = s1.find_last_not_of(s2);//在s1中查找最后一个不在s2中的字符

8、比较
C++的string提供了一个s1.compare()函数,类似于C语言中的strcmp函数 如果相等则返回0,不相等则返回-1

函数 ( ) 内的参数解释
s2比较 s 和 s2
pos1, n1 ,s2将 s 中从 pos1 开始的 n1 个字符与 s2进行比较
pos1, n1, s2, pos2, n2将 s 中从 pos1 开始的 n1 个字符与 s2 中从 pos2开始的 n2 个字符进行比较
cp比较 s 与 cp 指向的以空字符结尾的字符数组
pos1, n1, cp将 s 中从 pos1 开始的 n1 个字符与 cp 指向的以空字符结尾的字符数组进行比较
pos1, n1, cp, n2将 s 中从 pos1 开始的 n1 个字符与指针 cp 指向的地址开始的 n2 个字符进行比较

更多的string知识可以查询C++标准库类型string,本文仅为一个学习笔记
链接:https://blog.csdn.net/wanttifa/article/details/81333458

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值