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 ...
随机推荐
- css 初始化样式
@charset "UTF-8"; /* reset */ html,body,div,h1,h2,h3,h4,h5,h6,p,dl,dt,dd,ol,ul,li,fieldset ...
- SpringBoot 多数据源分布式事务
1.pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 微信支付的安全漏洞之XXE
1.场景:国外安全社区公布微信支付官方SDK存在严重漏洞,可导致商家服务器被入侵(绕过支付的效果).目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大(已确认陌陌.vivo因使用该SDK而存在该漏洞 ...
- Python运算符——复合运算符
就相当于算数运算符的后面加一个“=” 例:+= num = num+5 可以写成 num += 5 就是说,等式右边含有左边的变量名,就可以直接去掉,然后右边的符号移到左边去 同样的“-= / ...
- DcotrineFixtureBundle学习
根据官方文档对Fixture进行学习 首先使用 composer require --dev doctrine/doctrine-fixtures-bundle 来导入扩展 之后注意,如果symfon ...
- Fibonacci数列(数列 取模)
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- Nginx模块 ngx_http_limit_req_module 限制请求速率
The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a def ...
- python 试题
1.现有两元祖 (('a'),('b'),('c'),('d') ) ,请使用Python中的匿名函数生成列表 [ {'a':'c'},{'c':'d'}] 答案:v = list(map(lambd ...
- python一个命令开启http服务器
1.例如想共享文件在 E:python文件 打开cmd cd E: cd python文件 #进入要分享的文件夹 2.执行py脚本文件 python -m http.server 3.访问 本机i ...
- 获取远程IP、字符串解析
public class StringUtil { private static final Pattern IPV4_PATTERN = Pattern.compile( "^(25[0- ...