C++ 学习笔记之

您所在的位置:网站首页 红尘情歌二胡独奏曲谱 C++ 学习笔记之

C++ 学习笔记之

2024-07-07 05:38:48| 来源: 网络整理| 查看: 265

1. 字符数组

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

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 #include #include 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 #include 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 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. 修改字符串string& operator+= (const string& str);在字符串末尾添加元素,可以是字符数组、字符或者字符串类变量。string& append (const string& str);在字符串末尾添加元素。void push_back (char c);在字符串末尾添加一个字符。void pop_back();在字符串末尾删除一个字符。string& assign (const string& str);给字符串分配新的内容,与构造函数有同样的情况。void swap (string& str);与另一个字符串 str 进行交换。string& erase (size_t pos = 0, size_t len = npos);清除字符串的部分元素。string& replace (size_t pos, size_t len, const string& str);替换字符串的部分元素。string& insert (size_t pos, const string& str);;在 pos 位置前面插入元素。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 #include #include using namespace std; int main () { string str1 = "Hello, seniusen!"; string str2(str1); ostringstream foo(str1); // 默认在字符串起始位置添加 ostringstream bar(str2, ios_base::ate); // 在字符串末尾位置添加 foo


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭