在刷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. vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法

    前言 -webkit-box-orient: vertical在本地开发环境运行都没问题,一旦打包以后就会丢失 正文 原因: -webkit-box-orient: vertical  这个属性被 o ...

  2. RPC原理及实现

    一.什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个 ...

  3. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

    本文目录1. Net下日志记录2. NLog的使用    2.1 添加nuget引用NLog.Web.AspNetCore    2.2 配置文件设置    2.3 依赖配置及调用    2.4 日志 ...

  4. Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)

    <题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...

  5. Django与ajax、分页器

    ajax简单数据响应 ajax请求,后台只需要返回信息,所以不会出现render.redirect 模板层: $('.btn').click(function() { $.ajax({ url: '/ ...

  6. 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest

    A. Advertising Strategy 最优策略一定是第一天用$y$元,最后一天再用$x-y$元补满. 枚举所有可能的$y$,然后模拟即可,天数为$O(\log n)$级别. 时间复杂度$O( ...

  7. js 类数组对象arguments

    function Add() { for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } Add( ...

  8. 元素定位(d4-2)

    一,元素定位①优先级:首先选择id,其次选class,再就是根据其他唯一元素,在更加层级过滤定位,根据多属性定位,②首选CSS定位,在选XPATH定位 1.xpath定位 //*   获取当前网页全部 ...

  9. QT杂记(网上资料整理而成)

    1.新建工程时,Qwidget和Qdialog和Qmianwindow三者的区别? QWidget是所有图形界面的基类QMainWindow是一个提供了菜单.工具条的程序主窗口QDialog是对话框. ...

  10. [LeetCode] Design Circular Deque 设计环形双向队列

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...