1. 字符数组

字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'。C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中。

1.1. 字符串复制
  • void * memcpy ( void * destination, const void * source, size_t num ); 从 source 指针指向的内存拷贝 num 个字节到 destination 指针指向的内存;拷贝的是二进制数据,与两个指针类型没有关系;不检查字符串结束符,只是拷贝对应字节的数据;两个指针指向的数组大小至少都大于 num 个字节而且不应该有重叠。

  • void * memmove ( void * destination, const void * source, size_t num ); 和 memcpy 类似,只不过支持内存重叠,就好像是有一个中间缓冲区一样。

  • char * strcpy ( char * destination, const char * source ); 将 source 指针指向的字符串拷贝到 destination 指针指向的数组,包括终止字符, destination 指针指向的数组必须有足够的大小来容纳待拷贝字符串,并且不支持内存重叠。

  • char * strncpy ( char * destination, const char * source, size_t num ); 将 source 指针指向的前 num 个字符串拷贝到 destination 指针指向的数组,不支持内存重叠。如果 source 字符串长度大于 num,那么 destination 字符串将没有终止字符;如果 source 字符串长度小于 num,那么 destination 字符串会填充 0 直到总共有 num 个字符写入。

#include <iostream>
#include <stdio.h>
#include <cstring> using namespace std; struct {
char name[40];
int age;
} person, person_copy; int main ()
{
char myname[] = "seniusen"; /* 用 memcpy 拷贝字符串*/
memcpy(person.name, myname, strlen(myname)+1);
person.age = 22; /* 用 memcpy 拷贝结构体*/
memcpy(&person_copy, &person, sizeof(person)); printf("person_copy: %s, %d \n", person_copy.name, person_copy.age ); /* memmove 支持重叠内存的拷贝*/
char str[] = "seniusen works very hard.....!";
memmove(str+20, str+15, 9);
puts(str); return 0;
}

1.2. 字符串拼接
  • char * strcat ( char * destination, const char * source ); 将 source 指针指向的字符串拼接到 destination 指针指向的数组后,destination 的终止字符将被 source 的第一个字符覆盖,同时拼接后的字符串末尾会添加一个终止字符,不支持内存重叠。

  • char * strncat ( char * destination, const char * source, size_t num ); 将 source 指针指向的前 num 个字符串拼接到 destination 指针指向的数组,不支持内存重叠。如果 source 字符串长度小于 num,那么只拼接终止字符 '\0' 前面的内容。

1.3. 字符串比较
  • int strcmp ( const char * str1, const char * str2 ); 比较两个字符串 str1 和 str2,从第一个字符开始比较,如果相同则继续往下比较,直到遇到不同字符或者终止字符结束比较。

  • int strncmp ( const char * str1, const char * str2, size_t num ); 和 strcmp 类似,只不过是直到遇到不同字符或者终止字符或者已经比较了 num 个字符串就结束比较。

  • int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 和 strcmp 类似,只不过是遇到终止字符不会结束比较

  • int strcoll ( const char * str1, const char * str2 ); 由当前所选 C 语言环境的 LC_COLLATE 类别来定义比较规则,比如汉字可以按照拼音来比较。

  • size_t strxfrm ( char * destination, const char * source, size_t num ); 根据当前所选 C 语言环境的 LC_COLLATE 类别来转换 source 指向的字符串,并将转换后字符串的前 num 个字符复制到 destination,返回其长度。如果指定 destination 为空指针,num 为 0,此函数可以返回字符串的长度。

1.4. 字符串搜索
  • const void * memchr ( const void * ptr, int value, size_t num ); 查找 ptr 指向内存的前 num 个字节,看是否存在 value,如果存在则返回指向它的指针,value 和 ptr 指向的数组都被转化为无符号字符型数据来进行比较。

  • const char * strchr ( const char * str, int character ); 查找 str 指向的字符数组中是否存在 character,如果存在则返回第一个指向它的指针,character 被转化为字符型数据来进行比较,终止字符也可以被定位

  • const char * strrchr ( const char * str, int character ); 与 strchr 类似,只不过是返回最后一个指向它的指针

  • size_t strcspn ( const char * str1, const char * str2 ); 扫描在字符串 str1 中出现的第一个任意 str2 中的字符,返回找到时已经从 str1 中读取的字符个数,包括终止字符的搜索,也就是说,若 str2 中没有字符存在于str1 中,则返回 str1 的长度。

  • const char * strpbrk ( const char * str1, const char * str2 ); 扫描在字符串 str1 中出现的第一个任意 str2 中的字符,返回指向那个字符的指针,不包括终止字符的搜索但会在终止字符处结束,也就是说,若 str2 中没有字符存在于str1 中,则返回空指针。

  • size_t strspn ( const char * str1, const char * str2 ); 返回字符串 str1 中只包含 str2 中字符的部分的长度。如果 str1 中第一个字符就不在 str2 中,则返回 0;如果 str1 中所有字符都在 str2 中,则返回 str1 的长度;

  • const char * strstr ( const char * str1, const char * str2 ); 扫描字符串 str2 在 str1 中第一次出现的位置,不包括终止字符的搜索但会在终止字符处结束。

  • char * strtok ( char * str, const char * delimiters ); 在字符串 str 中先找到第一个不在 delimiters 中的字符,也就是口令的起始位置,然后以此为起点再继续找到第一个位于 delimiters 中的字符,这是口令的结束位置。然后通过传入一个 NULL 指针和新的 delimiters,函数会继续从上一个口令结束位置的下一个字符继续查找。

/* strtok example */
#include <stdio.h>
#include <string.h> int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}

1.5. 其它
  • size_t strlen ( const char * str ); 返回字符串的长度,也就是终止字符前面字符的个数。

  • void * memset ( void * ptr, int value, size_t num ); 将 ptr 指针指向内存区域前 num 个字节数据设置成 value,value 被转化为无符号字节型数据。

  • char * strerror ( int errnum ); 将 errnum 转化为描述错误情况的字符串。

2. 字符串类

此外,为了更方便地对字符串进行操作,C++ 中定义了一个 string 类,可以在使用的时候包含头文件 。

2.1. 构造函数
  • string(); 默认构造函数。

  • string (const string& str); 复制构造函数,定义一个对 str 进行复制的字符串。

  • string (const string& str, size_t pos, size_t len = npos); 以字符串 str 的 pos 位置开始长度为 len 的子字符串进行构造。

  • string (const char* s); 从字符数组构造。

  • string (const char* s, size_t n); 从 s 指向内存的前 n 个字符构造。

  • string (size_t n, char c); 构造一个具有 n 个字符 c 的字符串。

  • template <class InputIterator> string (InputIterator first, InputIterator last); 以 [first,last) 区间的字符串进行构造。

此外,可以用一个字符串类变量或者字符数组或者字符直接对字符串类变量进行赋值,两个字符串变量拼接则可以直接用加法来实现。

2.2. 迭代器
  • iterator begin(); 指向字符串第一个元素的迭代器。

  • iterator end(); 指向字符串最后一个元素后面位置的迭代器,如果字符串为空,则与 begin() 相同。

  • reverse_iterator rbegin(); 指向字符串最后一个元素的反向迭代器。

  • reverse_iterator rend(); 指向字符串第一个元素前面位置的反向迭代器。

2.3. 容量
  • size_t size() const; 字符串的长度。

  • size_t length() const; 字符串的长度,与 size() 等价。

  • size_t max_size() const; 字符串理论上的最大程度。

  • void resize (size_t n, char c); 重新设置字符串为 n 个字符的长度。如果 n 比现有字符串长度小,则只保留前 n 个字符;如果 n 比现有字符串长度大,则填充字符 c 或者 NULL。

  • size_t capacity() const; 返回字符串当前内存支持的最大长度,这个数字是动态变化的。

  • void reserve (size_t n = 0); 保证字符串至少能容纳 n 个字符。

  • void clear(); 清空字符串的内容。

  • bool empty() const; 返回字符串是否为空。

  • void shrink_to_fit(); 让字符串的容量等于其长度。

2.4. 元素访问
  • char& operator[] (size_t pos); 像数组一样访问位置 pos 处的字符。

  • char& at (size_t pos); 访问位置 pos 处的字符,会检查是否越界

  • char& front(); 返回字符串第一个字符。

  • char& back(); 返回字符串最后一个字符。

2.5. 修改字符串
2.6. 其它字符串操作

此外,字符串类还支持将字符串类变量转化为字符数组,在字符串中从前向后查找、从后向前查找等操作。更多方法见此

3. 字符串流

字符串流是以内存中的字符串类对象或者字符数组为输入输出对象的数据流,也即是将数据输出到字符串流对象或者从字符串流对象读入数据,也称之为内存流。

  • explicit ostringstream (const string& str, ios_base::openmode which = ios_base::out); 建立输出字符串流对象。
  • explicit istringstream (const string& str, ios_base::openmode which = ios_base::in); 建立输入字符串流对象。
  • explicit stringstream (const string& str, ios_base::openmode which = ios_base::in | ios_base::out); 建立输入输出输出字符串流对象。
#include <sstream>
#include <iostream>
#include <string> using namespace std; int main ()
{
string str1 = "Hello, seniusen!";
string str2(str1); ostringstream foo(str1); // 默认在字符串起始位置添加
ostringstream bar(str2, ios_base::ate); // 在字符串末尾位置添加 foo << " Hi, seniusen! ";
bar << " Well done!"; cout << foo.str() << '\n';
cout << bar.str() << '\n'; istringstream strin(str1);
string str3; strin >> str3; // 遇到空格停止插入
cout << str3 << endl; // 生成一个文件名
string str4;
stringstream ss; ss << "/home/seniusen/";
ss << 100;
ss << "_noise_image_";
ss << 15;
ss << ".jpg";
ss >> str4; cout << str4 << endl; return 0;
}

获取更多精彩,请关注「seniusen」!

C++ 学习笔记之——字符串和字符串流的更多相关文章

  1. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  2. 数据库学习笔记3 基本的查询流 2 select lastname+','+firstname as fullname order by lastname+','+firstname len() left() stuff() percent , select top(3) with ties

    数据库学习笔记3 基本的查询流 2   order by子句对查询结果集进行排序 多列和拼接 多列的方式就很简单了 select firstname,lastname from person.pers ...

  3. cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类

    前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类  __String . 使用cocos2d::__Str ...

  4. JavaScript学习笔记(二)——字符串

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  5. C#学习笔记6:各种字符串问题

    1.字符串 逐字字符串字面量:字符串前加@,不仅将反斜杠当做普通字符来处理,而且还会逐字解释所有空白字符. 如: Class Triangle { Static void Main() { Syste ...

  6. matlab学习笔记10_4MATLAB中的字符串表示

    一起来学matlab-字符串操作 10_4 MATLAB中的字符串表示 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感 ...

  7. python学习笔记-(五)字符串&字典

    1.字符串操作 >>> name = ("my name is cc")#首字母大写 >>> print(name.capitalize()) ...

  8. Python学习笔记(四)字符串型

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言 ...

  9. Python学习笔记-Day2-Python基础之字符串操作

    字符串的常用操作包括但不限于以下操作: 字符串的替换.删除.截取.复制.连接.比较.查找.分割等 这里将对字符串的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 ...

  10. python学习笔记(二)— 字符串(string)

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 ...

随机推荐

  1. 一个有意思的CSS样式库--BUTTONS

    我最近发现了一个有意思的CSS样式库,和Bootstrap相似,但是它是专门的一个高度可定制的,免费的并且开源的按钮CSS样式库,这里附上它的网址:http://www.bootcss.com/p/b ...

  2. Swift:一个基于.NET Core的分布式批处理框架

    Swift是什么 从文章的标题可知:此Swift非Apple那个Swift,只是考虑这个词的含义比较适合. Swift是一个基于.NET Core的分布式批处理框架,支持将作业分割后分发到多台服务器并 ...

  3. OGG故障集锦(一)

    说明:此系列仅作OGG故障记录,未包含处理过程.仅作故障备案 ①   ERROR OGG-00519 Source Context : SourceModule : [ggapp.ddl] Sourc ...

  4. 给出一个整数,将这个整数中每位上的数字进行反转(JavaScript编程)

    一.问题描述:给出一个整数,将这个整数中每位上的数字进行反转.示例:输入:123,输出321:输入-123,输出-321:输入120,输出-21 二.问题分析与解决: 需要将给出的整数反转,注意示例中 ...

  5. optimize table 删除空洞--MYSQL

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  6. Hive(7)-基本查询语句

    一. 表和数据准备 1. 数据地址 链接:https://pan.baidu.com/s/1crr8B9bD_0Phfm99vLCWjg  提取码:5jzw 2. 建表语句 create table ...

  7. VxWorks 7 技术简介

    VxWorks 7 是新一代的嵌入式实时操作系统,全新的架构设计,灵活化的组件配置,高可靠性与安全性,丰富的第三方软件包,极大的方便用户的开发和使用.本文对VxWorks7 的功能做个简要的记录. V ...

  8. C++ & java小结

    JAVA类: 每个类都属于一个包,private成员:只有该类可以访问,子类不能访问 Public:其他类可以访问 Protected: 只有本包内的类可以访问 如果在声明class时不加public ...

  9. JZ2440开发板:修改ARM芯片时钟(学习笔记)

    想要修改ARM芯片的时钟,需要去查询芯片手册和原理图,获取相关的信息(见下方图片) 首先来看时钟的结构图 根据结构图可以看出,时钟源有两种选择:1. XTIpll和XTOpll所连接的晶振 2. EX ...

  10. 利用主成分分析(PCA)简化数据

    一.PCA基础 线性映射(或线性变换),简单的来说就是将高维空间数据投影到低维空间上,那么在数据分析上,我们是将数据的主成分(包含信息量大的维度)保留下来,忽略掉对数据描述不重要的成分.即将主成分维度 ...