一、C++字符串
C++标准库中定义了一个string类,用来处理可变长字符序列。使用string类需要#include <string>
,定义在命名空间std中。
1、string的定义和初始化
string str1; //等价于string str1 = ""
string str2 = str1; //复制赋值
string str3 = "abcd"; //直接赋值
string str4(char *str); //字符串指针初始化
string str5(5, 'c'); //str5的内容为ccccc
2、string常用函数
/* 基本函数 */
str.empty(); //字符串是否为空
str.c_str(); //string转换成char *
str.size(), str.length(); //字符串大小,size()和length()一样
str[n]; //获取str第n个字符,类似于数组
/* 操作符 */
+, +=, //字符串相加:str1+str2, str1+=str2
==, !=, <>, <=, =>; //字符串比较
/* 常用函数 */
string& append(const string &s); //同operator+=()
string& append(int n, char c); //在当前字符串尾添加n个字符c
string& append(const string &s, int pos, int n); //连接s从pos开始的n个字符
string& append(const char *s); //连接c类型的字符串
string& append(const char *s, int n); //连接s的前n个字符
string substr(int pos=0, int n=npos) const;//返回从pos开始的n个字符组成的字符串
int find(char c, int pos=0) const; //从pos开始查找字符c出现的位置
int find(const string &s, int pos=0) const; //查找字符串s出现的位置
int find(const char *s, int pos=0) const;
int find(const char *s, int pos, int n) const; //查找s中前n个字符
int rfind(char c, int pos=npos) const; //反向查找字符c出现的位置
int rfind(const string &s, int pos=npos) const; //反向查找字符串出现的位置
void swap(string &s2); //交换当前字符串和s2的值
/*删除从p0开始的n0个字符,然后在p0处插入s*/
string& replace(int p0, int n0, const string &s);
/*删除从p0开始的n0个字符,然后在p0处插入s中从pos开始的n个字符*/
string& replace(int p0, int n0, const string &s, int pos, int n);
/*删除从p0开始的n0个字符,然后在p0处插入n个c*/
string& replace(int p0, int n0, int n, char c);
string& insert(int p0, const string &s); //在p0处插入s
string& insert(int p0, const string &s, int pos, int n);
string& insert(int p0, int n, char c);
string& erase(int pos=0, int n=npos);//删除pos开始的n个字符,返回修改后的字符串
二、C字符串
C没有封装字符串,使用的是char *指针或者char[]数组来表示。
1、初始化
const char *str1 = "abcd";
char str2[] = "abcd";
char *str3 = str2 + 1;
char *str4 = (char *)malloc(10);
2、常用函数
str[]; //按位置获取字符,char *不支持==, !=, <, >等操作符
size_t strlen(const char *str); //返回字符串的长度
char *strcat(char *dst, const char *src); //src连接到dst后,自动添加'\0',返回dst
char *strcpy(char *dst, const char *src); //拷贝src到dst,自动添加'\0',返回dst
int strcmp(const char *str1, const char *str2); //比较,相等为0
void *memset(void *dst, int c, size_t count); //将dst的前count字符复制为c
/*将src的前count字符复制到dst中,如果src和dst出现重叠,自动处理重叠*/
void *memmove(void *dst, const void *src, size_t count);
/*同memmove的功能相同,只是不能处理重叠,不会自动添加结束符*/
void *memcpy(void *dst, const void *src, size_t count);
/*比较buf1和buf2前count字节*/
int memcmp(const void *buf1, const void *buf2, size_t count);
char *strchr(const char *str, char c); //查找str中首次出现c的位置,没有返回NULL
char *strrchr(const char *str, char c); //查找str中最后一次出现c的位置
char *strstr(const char *str, const char *Search); //str中首次出现Search的位置
/*将src开始的count个字符添加到dst中,如果count大于src的长度,则会用src的长度替换到count。得到的dst会自动添加到'\0'*/
char *strncat(char *dst, const char *src, size_t count);
/*将src的count字符复制到dst中,如果count小于等于src的长度,则结尾不会加'\0',如果count大于src的长度,则会议NULL填充*/
char *strncpy(char *dst, const char *src, size_t count);
三、字符串转换
1、C、C++之间字符串转换
/* 1、C转换成C++ */
char *pc;
string str = string(pc);
/* 2、C++转换成C */
string str("OK");
char *pc = str.c_str();
2、C++字符串与整数之间转换
/* 1、字符串到数字 */
string str = "126";
stringstream sstr(str);
int x;
sstr >> x; //x为整数126,x定义什么类型,则输出什么类型
/* 2、数字到字符串 */
stringstream sstr;
int x = 126;
sstr << x;
string str = sstr.str(); //str为字符串"126"
3、C字符串与数字之间的转换
/* 1、字符串到数字 */
int atoi(const char *ptr);
int n;
char *str = "124";
n = atoi(str); //n=124,与atoi类似的还有atof、atol,分别为转化为浮点数、长整型等
/* 2、数字到字符串 */
char *itoa(int value, char *string, int radix); //与atoi相反,value为要转换的整数,string为转换后存储字符串的数组,radix为转换的进制数
int number = 156;
char str[10];
itoa(number, str, 10);
4、格式化字符串
scanf和printf函数都是针对标准输入输出进行格式化字符串的,在C中还有针对字符缓冲区进行字符串格式化的:sscanf和sprintf。
int sscanf(const char *str, const char *format, ...);
int sprintf(char *str, const char *format, ...);
eg:
sscanf(str, "%d", &i); //将字符串转换成整数i
sprintf(str, "%s", i); //将i转换成字符串
sprintf(str, "%s and %s", str1, str2); //连接字符串
格式化说明符
C函数中printf、sscanf、sprintf等都需要格式化符来决定输出格式的(format参数),下面为常见的格式化符。
- %d 十进制有符号数
- %u 十进制无符号数
- %f 浮点数包括float和double
- %s 字符串
- %c 单个字符
- %x 十六进制表示的整数
- %0 八进制表示的整数
- 控制字符宽度:在"%"和字母之间插进数字表示最大场宽
- 浮点数显示位数:%a.bf,a为总显示长度,b为小数位长度
- 对齐:默认为右对齐,在"%"和字母之间加"-"号为左对齐
- 填充:在"%"和数字前加0,表示用0填充(%08d,显示8位不足填0)