在刷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文档

C和C++字符串处理整理的更多相关文章

  1. Lua字符串库(整理)

    Lua字符串库小集 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回 ...

  2. Char型和string型字符串比较整理

    1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...

  3. vim 字符串替换整理

    公司项目测试,要在vi编辑其中进行多路径修改,这时候用到了字符串替换的知识,在这里我自己整理了一下. 一.基本内容替换,无特殊符号 :s/old/new/  替换当前行第一个 old 为 new   ...

  4. C/C++字符串使用整理

    在C语言中,字符串有多种操作与处理方法.话不多说,下面就整理一下C语言中字符串的使用整理. 1.头文件 字符串的头文件: #include<cstring> 2.输入 通常,字符串有多种输 ...

  5. [IOS 开发] NSDateFormatter的格式字符串 -- 《整理的笔记》

    在ios开发中, OBjective-C中的NSDate是一个挺讨厌的类型, 自己找不到转换成字符串的类型,还得带一个NSDateFormatter的类型. 官方文档上对NSDateFormatter ...

  6. 工作中用到的oracle字符串分割整理

    oracle部分: 定义类型(用于字符串分割): create or replace TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000); 字 ...

  7. ACM 字符串 题目整理

    AC自动机 UVa 11468  Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. ...

  8. PHP 常用字符串函数整理

    PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($str ...

  9. 306573704 Char型和string型字符串比较整理(转)

    1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...

随机推荐

  1. cdh zookeeper 不断拒绝连接

    测试hiveserver2高可用的时候,需要登录zookeeper检查hiveserver2是否在zookeeper中注册 执行 zookeeper-client 不断的拒绝连接 -- ::, [my ...

  2. tp5的phpword使用

    1.使用composer安装phpoffice/phpword phpword的使用文档:https://phpword.readthedocs.io/en/latest/index.html 2.使 ...

  3. html基础技巧:点击、placeholder、文本、字体、清楚浮动

    点击处理: 消除a标签点击后的边框,颜色(background:#fff) 1:a:focus{outline:none;} button去除边框 1:border:none 2:border:0px ...

  4. C#+EntityFramework编程方式详细之Code First

    Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...

  5. django 实战篇之路由层

    路由层 如何给网页添加首页及尾页 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',views.test), url(r'te ...

  6. Set集合(scala)

    特点 Set集合最大的特点是:无序 不可重复 定长Set集合 无序 scala> val set = Set(1,5,4,3,7) set: scala.collection.immutable ...

  7. Felx布局基础教程

    网页布局即layout是css的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...

  8. pip错误-failed to create process/fatal error in launcher

    电脑同时装了python2和python3,并且都配置了环境变量 将python2的python.exe改成python2.exe,python3的python.exe没有改(主要用python2时则 ...

  9. python---哈希算法实现

    # coding = utf-8 class Array: def __init__(self, size=32, init=None): self._size = size self._items ...

  10. 纯css画直角三角形

    所有的三角形,都是通过盒子模型来设定. border(边框)的不同大小来决定 border-width: 边框的宽度 border-style: 边框的样式 border-color: 边框的颜色 1 ...