在刷leetcode题目的过程中,发现自己对于c和c++字符串的处理并不是很拿手,处理起来比较费劲,而且,算法题似乎很中意字符串的处理,有很多题目都涉及到它。字符串处理比较基础,但是很重要,因此,整理和深入学习字符串的处理对于后续的学习来说拥有巨大的作用。
首先,看C语言环境下对于字符串的处理方式:
c语言中没有string类,其对字符串的存储都是利用char数组实现的,其对字符串的管理主要从以下几个方面展开:
一、字符串的初始化
c语言中,字符串初始化有三种方式:
(1) char str1[] = "hello"
: 此种初始化方式,默认在字符串最后添加'\0';
(2)char str2[] = {'h','e','l','l','o','\0'}
:标准C风格的字符串初始化格式,即为字符串数组,切记不要忘记最后的'\0',否则对该字符串操作时将无法判断字符串的结束,而只能以字符数组来对待。
(3)char *pstr = "hello"
:该种方式看似和第(1)中方式类似,其实不然。该种方式初始化的字符串是字符串常量,其内容存储在静态数据区,不可更改。该方式初始化时的操作为:先在静态数据区分配内存存储该字符串常量,然后,将其地址赋值给pstr指针,所以,该种方式是字符串常量,不可更改。
二、字符类型判断
字符串类型判断的函数包含在 < ctype.h>头文件中,其中主要定义了判断一个字符的类型的函数。int isalnum(int ch)
:判断所给字符是否是字母(包括数字/大写字母和小写字母)。int isalpha(int ch)
:判断所给字符是否是拼音(包括大写和小写字母)。int islower/isupper(int ch)
:判断所给字符是否是大/小写字母。int isdigit(int ch)
:判断所给字符是否是数字int iscntrl(int ch)
:判断所给字符是否是控制字符int isspace(int ch)
:判断所给字符是否是空格
等等
三、字符串与整型、浮点型的转换
1.字符串与其他类型的转换函数包含在< stdlib.h>头文件中,主要包括:
(1)double atof(const char* str)
:字符串转浮点数
(2)int atoi/atol/atoll(const char* str)
:字符串转整型
(3)strtol/strtoll/strtoul/strtoull/strtof(const char* str)
:字符串转整型、无符号整数等
2.整型转字符串itoa/ltoa/ultoa
四、字符串常用操作
(1)char *strcpy(char *dest, const char *src)
:字符串拷贝
(2)int strcmp(const char *lhs, const char *rhs)
:字符串比较
(3)char *strcat(char *dest, const char *src)
:字符串追加
(4)size_t strlen(const char *str)
:字符串长度
(5)char *strchr(const char *str, int ch)
:在str中查找字符ch,返回以ch为开头的子串
(6)char *strstr(const char *str, const char *substr)
:查找子串,并返回子串的位置
五、字符数组常用操作(内存操作)
(1)void* memchr(const void* ptr, int ch, size_t count)
:在指定长度字符串中查找字符ch,并返回以ch开头的子串
(2)int memcmp(const char* lhs, const void* rhs, size_t count)
:字符串比较
(3)void* memset(void* dst, int ch, size_t count)
:用同一个字符填充内存区域
(4)void* memcpy(void* dst, const void* src, size_t count)
:字符串拷贝
(5)void* memmove( void* dst, const void* src, size_t count)
:字符串移动
值得注意的是,char数组表示字符串时,最后一定要加上‘\0’,及NUL字符,代表字符串的结束。用于遍历字符串的很多操作都是基于NUL字符作判断的。
然后,我们再来看一下C++环境下对于字符串的处理操作:
c++相对于c语言来说,对于字符串的操作进行了优化,c++专门提供了string模板类专门对字符串进行处理,大大提高了对字符串的处理能力。
一、字符串初始化
C++中 string类定义在< string>头文件中,因为string是一个模板类,所以它对于字符串的初始化都是通过构造函数实现的。string有如下几种常用的初始化方式。
构造函数 -> 语法样例
(1)string::string() -> std::string s
(2)string::string(size_type count, charT ch) -> std::string s(4, '=')
//s = "===="
(3)string::string(string const& other, size_type pos, size_type count) -> std::string s(other, 0, other.length())
(4)string::string(charT const* s, size_type count) -> std::string s("c-type string", 14)
(5)string::string(charT const* s) -> std::string s("c-type string")
二、字符串赋值
c++字符串可以使用operator=
或者是assign
函数对字符串类型变量进行赋值。
(1)string s = "1234rdf"
//运算符=重载
(2)assign(size_type count, charT ch)
(3)assign(basic_string const& str)
(4)assign(basic_string const& str, size_type pos, size_type count)
(5)assign(basic_string&& str) -> s.assign(std::string("c++ by") + "example")
(6)assign(charT const* s, size_type count)
(7)assign(charT const* s)
三、字符串与整型、浮点型转换
C++提供了更为友好和更为灵活的字符串与其他类型转换的新的接口函数,主要包括stoi、stol、stoll、stoul、stoull、stof、stod、stold以及to_string
(1)字符串转整型/浮点型:stoX
系列函数增加了进制参数,使更灵活。如int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
(2)整型/浮点型转字符串:std::string to_string(int/long/long long/unsigned long/float/double value)
(3)字符串与c字符数组的转换:s.c_str()
四、字符串操作
一方面,c++字符串的操作都包含在< string>头文件中,比较集中,API文档描述很清楚;另一方面,已经有很多人总结了其用法,可参见https://www.cnblogs.com/lidabo/p/3487043.html,该篇文章详细介绍了c++字符串的相关操作,此处不再赘述。
参考资料
[1]c和c++字符串处理大集合.https://www.cnblogs.com/lidabo/p/3487043.html
[2]c和c++ API文档