C语言字符串
定义字符串
char 字符数组名[常量表达式] ;
例如:
char s[20];
初始化
char s[6] = {‘h’,‘e’,‘l’,‘l’,‘o’} //字符串初始化
char s[6] = “hello” //也可以
结尾
char 类型的字符串以’\0’结尾
实际上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