C和C++字符串处理整理
在刷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++字符串处理整理的更多相关文章
- Lua字符串库(整理)
Lua字符串库小集 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string.rep(s,n) 返回 ...
- Char型和string型字符串比较整理
1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...
- vim 字符串替换整理
公司项目测试,要在vi编辑其中进行多路径修改,这时候用到了字符串替换的知识,在这里我自己整理了一下. 一.基本内容替换,无特殊符号 :s/old/new/ 替换当前行第一个 old 为 new ...
- C/C++字符串使用整理
在C语言中,字符串有多种操作与处理方法.话不多说,下面就整理一下C语言中字符串的使用整理. 1.头文件 字符串的头文件: #include<cstring> 2.输入 通常,字符串有多种输 ...
- [IOS 开发] NSDateFormatter的格式字符串 -- 《整理的笔记》
在ios开发中, OBjective-C中的NSDate是一个挺讨厌的类型, 自己找不到转换成字符串的类型,还得带一个NSDateFormatter的类型. 官方文档上对NSDateFormatter ...
- 工作中用到的oracle字符串分割整理
oracle部分: 定义类型(用于字符串分割): create or replace TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000); 字 ...
- ACM 字符串 题目整理
AC自动机 UVa 11468 Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. ...
- PHP 常用字符串函数整理
PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($str ...
- 306573704 Char型和string型字符串比较整理(转)
1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...
随机推荐
- 还在期待安卓9.0吗?Android 10.0要来了
目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 Android 9.0 系统(修改UI界面也算是二次开发,嗯) ...
- UiAutomator1.0 与 UiAutomator2.0
在使用2.0之前,对android自动化框架也做过一些了解<Android 自动化测试框架>.使用UiAutomator2.0也有一段时间,这里将1.0与2.0进行一个对比总结. Ui ...
- EF 简单介绍<一>
一:EF概述 Entity Framework(EF)是一个开源的“对象/关系映射(ORM:Object Relational Mapping)”框架,使应用程序可以使用一种“纯”的对象模型来访问关系 ...
- [转] 扩展微信小程序框架功能
通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...
- Angular项目中核心模块core Module只加载一次的实现
核心模块CoreModule在整个系统中只加载一次,如何实现? 创建core Modele:ng g m core 既然CoreModule是类,就有构造函数,在构造函数中进行依赖注入. export ...
- Imcash:坐下来认真和你们说说话
筹备已久的Imcash终于快上线了,上线后会用作品向你们证明你们的选择是正确的.在准备的半年期间里,团队从调研.设计.市场.人员.技术方面都尽量按照最高要求来配置.从一站式服务平台到现在的资产管家,每 ...
- 自定义InputFormat和OutputFormat案例
一.自定义InputFormat InputFormat是输入流,在前面的例子中使用的是文件输入输出流FileInputFormat和FileOutputFormat,而FileInputFormat ...
- ECMAScript6 入门-let与const命令
块级作用域 1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了. { let a =10; var b =1; } a // Referen ...
- git 入门教程之删除文件
删除文件 回忆一下文件的常见操作,新增文件,修改文件,删除文件等,新增和修改文件都单独讨论过,现在我们来研究一下如何删除文件. 你可能会说删除文件还不简单啊,直接 rm -rf <file> ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...