当前位置: 首页 > news >正文

书w3school网站建设教程线上推广有哪些

书w3school网站建设教程,线上推广有哪些,甘肃省住房和城乡建设厅网站职称证查询,怎么做网站收广告费目录 一、引言 二、基础准备#xff1a;头文件与命名空间 三、string对象的创建与初始化(基础#xff09; 3.1 直接初始化 3.2 动态初始化#xff08;空字符串#xff09; 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1 …目录 一、引言 二、基础准备头文件与命名空间 三、string对象的创建与初始化(基础 3.1 直接初始化 3.2 动态初始化空字符串 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1  length()  和  size()  4.1.2  capacity()  和  reserve()  4.2 字符串拼接 4.2.1    运算符与    复合赋值 4.2.2  append()  函数不咋好有不推荐 4.3 字符串查找 4.3.1  find()  系列函数 4.4 子串提取 4.5 字符串替换 4.5.1  replace()  函数 4.6 字符串比较 4.6.1  compare()  函数 4.6.2 关系运算符推荐 4.7 字符串插入少用效率太底 4.8 字符串删除不推荐理由如上 4.9 字符串清空 4.10 字符串遍历 4.10.1 迭代器遍历 4.10.2 范围-based for循环 4.11  getline() 函数 4.12  reverse() 函数 4.13  at() 函数参考operator[ ]) 4.14 数值与字符串转换相关函数 4.14.1  to_string() 函数 4.14.2  atoi() 函数 4.14.3  itoa() 函数非标准库函数 4.15  shrink_to_fit() 函数 4.16  assign() 函数(作用类似于覆盖) 五、高级应用与性能优化 5.1  stringstream  流处理 5.2 性能优化技巧 六、总结 一、引言 在C编程体系中 string  类是处理文本数据的核心组件。相较于传统C风格以  \0  结尾的字符数组 string  类通过封装大量实用函数不仅避免了手动内存管理的繁琐与安全隐患还提供了丰富的操作方式极大提升了字符串处理的便捷性和安全性。本文将对  string  库中常用函数进行深度剖析结合大量代码示例与注意事项帮助开发者全面掌握其使用技巧。 二、基础准备头文件与命名空间 使用  string  类前必须包含  string  头文件并处理命名空间。常见方式有两种 cpp // 方式一引入整个std命名空间#include stringusing namespace std;// 方式二显式指定std命名空间#include stringstd::string str; 注意引入整个  std  命名空间可能引发命名冲突如自定义函数名与  std  中函数名重复推荐在小型项目或明确无冲突风险时使用显式指定命名空间更安全适合大型项目。 三、string对象的创建与初始化(基础 3.1 直接初始化 cpp // 字面量初始化string str1 Hello, C;string str2(This is a string);// 拷贝初始化string str3 str1; 3.2 动态初始化空字符串 cpp string emptyStr; // 长度为0的字符串 3.3 基于字符数组初始化 cpp char cArray[] {H, e, l, l, o, \0};string strFromArray(cArray); 3.4 重复字符初始化 cpp string repeated(5, a); // 生成字符串 aaaaa 四、核心函数详解 4.1 字符串长度相关 4.1.1  length()  和  size()  cppstring str Programming;size_t len1 str.length(); // 11size_t len2 str.size(); // 11 注意 -  length()  和  size()  功能完全相同 size()  是为了与STL容器接口统一。 - 返回值类型  size_t  是无符号整数与负数比较时需格外小心例如 cppstring str test;if (str.length() -1) { // 永远为真-1会隐式转换为超大无符号数// ...} 4.1.2  capacity()  和  reserve()  capacity()  返回当前字符串已分配的内存空间以字符为单位 reserve()  用于预分配内存减少动态扩容次数。 cppstring str;cout 初始容量: str.capacity() endl; // 可能是15或其他默认值str.reserve(100); // 预分配100个字符的空间cout 调整后容量: str.capacity() endl; // 至少为100 注意 reserve()  不改变字符串实际长度仅影响内存分配若传入参数小于当前容量 reserve()  通常不执行操作。 4.2 字符串拼接 4.2.1    运算符与    复合赋值 cppstring str1 Hello;string str2 World;string result str1 , str2; // Hello, World str1 , C; // 等价于 str1 str1 , C 4.2.2  append()  函数不咋好有不推荐 cppstring str Apple;// 追加字符串str.append( and Banana); // Apple and Banana// 追加子串从源字符串第3个位置开始取4个字符str.append(Cherry, 3, 4); // Apple and Bananarry// 追加字符数组char arr[] {!, \0};str.append(arr); // Apple and Bananarry! 注意 append()  支持多种参数类型使用时需确保索引和长度合法避免越界。 4.3 字符串查找 4.3.1  find()  系列函数 cppstring str banana;// 查找子串首次出现位置size_t pos1 str.find(na); // 2// 查找字符最后出现位置size_t pos2 str.rfind(a); // 5// 查找字符集中任意字符首次出现位置size_t pos3 str.find_first_of(aeiou); // 1// 查找字符集中未出现的字符首次位置size_t pos4 str.find_first_not_of(abn); // string::npos 注意 - 所有查找函数未找到时均返回  string::npos 建议使用  if (pos ! string::npos)  进行判断。 -  find_first_of()  和  find_last_of()  匹配字符集中任意字符而非整个集合。 4.4 子串提取 cppstring str Hello, World;// 提取从索引7开始长度为5的子串string sub str.substr(7, 5); // World// 若省略长度参数提取到字符串末尾string subAll str.substr(7); // World 注意起始索引不能超过字符串长度否则行为未定义长度参数过大时会截取到字符串末尾。 4.5 字符串替换 4.5.1  replace()  函数 cppstring str old text;// 从索引4开始替换4个字符str.replace(4, 4, new); // old new// 按子串替换替换所有匹配项str apple apple;str.replace(str.find(apple), 5, banana); // banana apple 注意若要替换所有匹配项需循环调用  replace() 替换操作可能改变字符串容量和迭代器状态。 4.6 字符串比较 4.6.1  compare()  函数 cppstring str1 apple;string str2 banana;int cmp str1.compare(str2); // cmp 0 4.6.2 关系运算符推荐 cppif (str1 str2) {cout str1小于str2 endl;} 注意比较规则基于字典序ASCII码顺序 compare()  可指定子串进行局部比较如  str1.compare(0, 3, str2, 0, 3) 。 4.7 字符串插入少用效率太底 cppstring str Hello;// 在索引5处插入字符串str.insert(5, , World); // Hello, World// 插入多个重复字符str.insert(0, 3, *); // ***Hello, World 注意插入操作会改变字符串长度和内存布局可能导致迭代器失效插入位置需在合法范围内。 4.8 字符串删除不推荐理由如上 cppstring str Hello, World;// 删除从索引7开始的5个字符str.erase(7, 5); // Hello, // 删除单个字符通过迭代器str.erase(str.begin() 5); // Hello 注意使用迭代器删除时需确保迭代器有效删除操作后后续迭代器会失效。 4.9 字符串清空 cppstring str data;str.clear(); // 长度变为0容量可能保留 注意 clear()  仅清空内容不释放内存若需释放内存可使用  str.shrink_to_fit() 。 4.10 字符串遍历 4.10.1 迭代器遍历 cppstring str abc;for (string::iterator it str.begin(); it ! str.end(); it) {*it toupper(*it); // 转换为大写} toupper为示例以后会将。 4.10.2 范围-based for循环 cppstring str 123;for (char c : str) {cout c endl;} 注意修改字符串内容时需使用非  const  迭代器范围循环中修改元素需通过引用如  for (char c : str) 。 4.11  getline() 函数   getline() 函数是C中用于从输入流中读取整行数据的重要工具它在处理包含空格或特殊字符的字符串输入时极为实用。(替换cin该函数定义于 string 头文件中通过指定输入流对象和目标 string 对象将输入流中的字符按行读取并存储。   函数原型   cpp    istream getline(istream is, string str, char delim \n); 其中 is 表示输入流如 cin 用于从控制台读取 str 是用于存储读取结果的 string 对象 delim 是可选参数用于指定行结束的分隔符默认值为换行符 \n 。   示例代码   cpp#include iostream #include string using namespace std;int main() {string userInput;cout 请输入一行包含空格的内容例如Hello, World!: ;getline(cin, userInput);cout 你输入的完整内容是: userInput endl;// 指定其他分隔符的示例string data apple;banana;cherry;string token;size_t pos 0;while ((pos data.find(;)) ! string::npos) {token data.substr(0, pos);cout 提取的子串: token endl;data.erase(0, pos 1);}if (!data.empty()) {cout 最后一个子串: data endl;}return 0; } 运行结果   plaintext请输入一行包含空格的内容例如Hello, World!: This is a test line. 你输入的完整内容是: This is a test line. 提取的子串: apple 提取的子串: banana 最后一个子串: cherry 注意事项   1. 输入流状态检查当输入流发生错误如磁盘读取错误或到达文件末尾EOF时 getline() 会停止读取并使输入流进入错误状态。可以通过 if (cin) 或 cin.good() 检查输入流是否处于有效状态。   2. 分隔符处理若指定了非默认分隔符如上述代码中的 ;  getline() 会读取字符直至遇到该分隔符。分隔符本身会被读取但不会存储到目标 string 中。   3. 缓冲区残留问题在使用 getline() 之前如果有其他输入操作如 cin num 读取数字可能会在输入缓冲区中残留换行符。此时可以先用 cin.ignore() 清除缓冲区残留字符再调用 getline() 避免读取到空字符串。   4. 性能考量 getline() 每次读取都会动态分配内存来存储字符串频繁调用可能影响性能。在处理大量数据时可以预先使用 reserve() 为目标 string 分配足够的空间。   4.12  reverse() 函数   reverse() 函数用于反转字符串中字符的顺序定义于 algorithm 头文件中属于STL标准模板库算法的一部分。它通过操作迭代器范围来实现字符串反转适用于需要快速颠倒字符串内容的场景。   函数原型   cpptemplateclass BidirectionalIterator void reverse(BidirectionalIterator first, BidirectionalIterator last); 其中 first 和 last 是双向迭代器指定要反转的字符范围左闭右开区间即包含 first 指向的字符不包含 last 指向的字符。   示例代码   cpp#include iostream #include string #include algorithm using namespace std;int main() {string original C is powerful;cout 原始字符串: original endl;reverse(original.begin(), original.end());cout 反转后的字符串: original endl;// 反转子串示例string subStr hello, world;reverse(subStr.begin() 7, subStr.end());cout 反转部分子串后的结果: subStr endl;return 0; } 运行结果   plaintext原始字符串: C is powerful 反转后的字符串: lufrewop si C 反转部分子串后的结果: hello, dlrow 注意事项   1. 迭代器有效性传递给 reverse() 的迭代器必须指向有效的内存位置且 last 迭代器需在 first 迭代器之后指向更大的地址否则会导致未定义行为。   2. 对其他容器的适用性 reverse() 不仅适用于 string 还可用于其他支持双向迭代器的容器如 vectorchar 但需确保容器类型兼容。   3. 性能与内存 reverse() 操作通常效率较高因为它仅改变字符顺序不涉及额外的内存分配。但对于大型字符串操作过程中可能会占用一定的栈空间。   4.13  at() 函数参考operator[ ])   at() 函数是 string 类提供的成员函数用于访问字符串中指定位置的字符。与通过 [] 运算符访问字符不同 at() 函数会进行严格的越界检查若访问位置超出字符串长度会抛出 std::out_of_range 异常。   函数原型   cppchar at(size_t pos); const char at(size_t pos) const; 其中 pos 是要访问的字符的索引位置从0开始。非 const 版本返回可修改的字符引用 const 版本用于常量字符串返回常量字符引用。   示例代码   cpp#include iostream #include string #include exception using namespace std;int main() {string text example;try {char normalChar text.at(3);cout 正常访问索引3处的字符: normalChar endl;char badChar text.at(10);  // 触发越界异常} catch (const out_of_range e) {cerr 捕获到异常: e.what() endl;}// 与[]运算符对比try {char safeChar text[3];char riskyChar text[10];  // 不会抛出异常但结果未定义cout 使用[]访问越界位置未触发异常结果不可靠 endl;} catch (...) {cerr 使用[]访问未触发异常捕获 endl;}return 0; } 运行结果   plaintext    正常访问索引3处的字符: a 捕获到异常: basic_string::at: __n (which is 10) this-size() (which is 7) 使用[]访问越界位置未触发异常结果不可靠     注意事项   1. 异常处理成本 at() 的越界检查和异常抛出机制增加了代码的安全性但也带来了性能开销。在已知索引合法的场景下如遍历字符串使用 [] 运算符可能更高效。   2. 字符修改通过 at() 返回的引用可以修改字符串中的字符但需确保字符串本身是非 const 类型。   3. 索引类型 at() 的参数类型为 size_t 无符号整数传入负数会导致编译错误或未定义行为。   4.14 数值与字符串转换相关函数   4.14.1  to_string() 函数   to_string() 函数是C11引入的标准库函数用于将基本数值类如 int 、 double 、 long 等转换为对应的字符串表示。它极大简化了数值与文本之间的转换过程。   函数原型   cppstring to_string(int val); string to_string(long val); string to_string(long long val); string to_string(unsigned val); string to_string(unsigned long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val); 每个重载版本对应不同的数值类型返回值为转换后的字符串。   示例代码   cpp#include iostream #include string using namespace std;int main() {int numInt 123;double numDouble 3.14159;string strInt to_string(numInt);string strDouble to_string(numDouble);cout 整数 numInt 转换为字符串: strInt endl;cout 浮点数 numDouble 转换为字符串: strDouble endl;// 拼接字符串示例string result The value is to_string(numDouble) and the count is to_string(numInt);cout result endl;return 0; } 运行结果   plaintext整数 123 转换为字符串: 123 浮点数 3.14159 转换为字符串: 3.141590 The value is 3.141590 and the count is 123 注意事项   1. 精度控制对于浮点数转换 to_string() 默认保留6位小数。如需自定义精度可使用 stringstream 或 std::format C20等工具。   2. 性能优化虽然 to_string() 方便易用但频繁调用可能产生大量临时字符串对象。在性能敏感场景下可预先计算字符串长度并使用 std::snprintf 等C风格函数手动构建字符串。   4.14.2  atoi() 函数   atoi()  ASCII to Integer 函数用于将字符串转换为整数其功能仅限于处理以数字开头的字符串并在遇到非数字字符时停止转换。该函数定义于 cstdlib 头文件中同时还有 atol() 转换为 long 、 atoll() 转换为 long long 等变体。   函数原型   cppint atoi(const char* str); 参数 str 是指向以 \0 结尾的字符数组的指针返回值为转换后的整数。若字符串无法转换如开头非数字返回0。   示例代码   cpp#include iostream #include string #include cstdlib using namespace std;int main() {string numStr 42abc;int result atoi(numStr.c_str());cout 字符串 \ numStr \ 转换为整数: result endl;string badStr abc123;int badResult atoi(badStr.c_str());cout 无法转换的字符串 \ badStr \ 结果: badResult endl;return 0; } 运行结果   plaintext字符串 42abc 转换为整数: 42 无法转换的字符串 abc123 结果: 0 注意事项   1. 参数类型转换由于 atoi() 接受 const char* 类型参数使用 string 对象时需调用 c_str() 方法进行转换。   2. 错误处理 atoi() 无法区分输入错误如非数字开头和有效输入如字符串 0 需要额外逻辑判断输入合法性。   3. 溢出风险若转换结果超出 int 类型的表示范围如 2147483647 以上的正数 atoi() 的行为未定义。建议使用 std::stoi 等更安全的C风格转换函数替代。   4.14.3  itoa() 函数非标准库函数   itoa()  Integer to ASCII 函数用于将整数转换为字符串但其并非C标准库的一部分不同编译器和平台的实现存在差异。例如在Windows平台的Visual C中可直接使用而在Linux的GCC中需通过 sprintf(C) 或 std::stringstream 等方式替代。   Windows平台示例代码   cpp#include iostream #include string #include stdlib.h  // 包含itoa定义Windows特定 using namespace std;int main() {int number -123;char buffer[20];itoa(number, buffer, 10);  // 第二个参数是目标字符数组第三个参数是进制数10表示十进制string result(buffer);cout 整数 number 转换为字符串: result endl;return 0; } 运行结果   plaintext整数 -123 转换为字符串: -123 替代方案GCC/Linux   cpp#include iostream #include string #include sstream using namespace std;string customItoa(int num) {stringstream ss;ss num;return ss.str(); }int main() {int number 456;string result customItoa(number);cout 整数 number 转换为字符串: result endl;return 0; } 注意事项   1. 可移植性问题由于 itoa() 不属于标准库使用该函数会导致代码在不同平台间无法直接移植。为确保兼容性推荐使用 to_string() 或 stringstream 等标准方法。   2. 缓冲区管理在使用 itoa() 时需手动指定目标字符数组的大小若数组空间不足可能导致缓冲区溢出。   3. 功能局限性 itoa() 仅支持有限的进制转换如2、8、10、16而 stringstream 等方式可更灵活地控制输出格式。 4.15  shrink_to_fit() 函数   shrink_to_fit()  函数是  string  类的成员函数用于释放字符串中未使用的额外内存将字符串的容量 capacity 调整为当前实际使用的大小 size 。在对字符串进行了多次插入、删除操作后字符串的容量可能会大于实际存储字符所需的空间(空间对齐 shrink_to_fit()  函数可以帮助优化内存使用。如果数据没有clear则shrink_to_fit不会删除空间)   函数原型   cppvoid shrink_to_fit(); 该函数没有参数也没有返回值直接对调用它的  string  对象进行内存调整操作。   示例代码   cpp#include iostream #include string using namespace std;int main() {string str initial string;cout 初始容量: str.capacity() endl;cout 初始大小: str.size() endl;// 进行一些操作可能导致容量增加for (int i 0; i 100; i) {str a;}cout 操作后的容量: str.capacity() endl;cout 操作后的大小: str.size() endl;str.shrink_to_fit();cout 调用shrink_to_fit后的容量: str.capacity() endl;cout 调用shrink_to_fit后的大小: str.size() endl;return 0; } 运行结果示例实际结果可能因编译器和平台不同而有所差异   plaintext初始容量: 31 初始大小: 14 操作后的容量: 127 操作后的大小: 114 调用shrink_to_fit后的容量: 114 调用shrink_to_fit后的大小: 114 注意事项   1. 并非保证完全释放内存虽然  shrink_to_fit()  的目的是释放未使用的内存但具体的实现可能会因为编译器和标准库的不同而有所差异有些情况下可能无法将容量精确地调整为大小或者可能会保留一些额外的内存空间。   2. 可能导致迭代器失效调用  shrink_to_fit()  函数会改变字符串的内存布局因此在调用该函数之前获取的所有迭代器、引用和指针都将失效使用它们会导致未定义行为。   3. 性能影响执行  shrink_to_fit()  操作可能涉及重新分配内存和复制数据对于大型字符串这可能会带来一定的性能开销因此在性能敏感的场景中需要谨慎使用。   4.16  assign() 函数(作用类似于覆盖)   assign()  函数是  string  类的成员函数用于将一个新的字符串值赋给当前  string  对象它提供了多种重载形式可以以不同的方式指定要赋值的内容。   函数原型及示例   1. 赋值字符串字面量   cppstring assign(const char* s); cpp#include iostream #include string using namespace std;int main() {string str;str.assign(new string value);cout 赋值后的字符串: str endl;return 0; } 运行结果   plaintext赋值后的字符串: new string value 1. 赋值另一个  string  对象   cppstring assign(const string s);cpp#include iostream #include string using namespace std;int main() {string str1 original;string str2;str2.assign(str1);cout str2赋值后的内容: str2 endl;return 0; } 运行结果   plaintextstr2赋值后的内容: original 1. 赋值字符串的子串   cppstring assign(const char* s, size_t n); 其中  s  是字符指针 n  是要复制的字符个数。   cpp#include iostream #include string using namespace std;int main() {string str;const char* source abcdefg;str.assign(source, 3);cout 赋值子串后的字符串: str endl;return 0; } 运行结果   plaintext赋值子串后的字符串: abc 1. 重复赋值字符   cppstring assign(size_t n, char c); 其中  n  是重复的次数 c  是要重复的字符。   cpp#include iostream #include string using namespace std;int main() {string str;str.assign(5, *);cout 重复赋值字符后的字符串: str endl;return 0; } 运行结果   plaintext重复赋值字符后的字符串: ***** 注意事项   1. 覆盖原有内容 assign()  函数会完全覆盖当前  string  对象的原有内容因此在调用该函数之前需要确保不再需要原有的字符串数据。   2. 内存管理根据赋值的内容不同 assign()  可能会重新分配内存来存储新的字符串。如果新字符串比原字符串大会进行内存扩容如果新字符串比原字符串小可能会导致内存释放或保留取决于具体实现。   3. 迭代器和引用失效由于  assign()  会改变字符串的内容和长度可能会导致之前获取的迭代器、引用和指针失效使用它们会导致未定义行为。在调用  assign()  之后如果需要使用迭代器等应该重新获取。 五、高级应用与性能优化 5.1  stringstream  流处理 stringstream  用于字符串与其他数据类型的转换例如 cpp#include sstreamstring numStr 123;int num;stringstream ss(numStr);ss num; // num 123 5.2 性能优化技巧 - 预分配内存使用  reserve()  减少动态扩容次数。 - 避免频繁拷贝优先使用  std::move()  转移字符串所有权减少深拷贝开销。 - 临时对象复用避免在循环中创建大量临时  string  对象。 六、总结 C  string  库的函数体系覆盖了字符串处理的全生命周期从基础创建、拼接、查找到复杂的替换、性能优化每个函数都有其独特的应用场景。开发者在使用时需注意边界条件、内存管理和迭代器有效性等问题结合实际需求灵活运用才能发挥  string  类的最大效能。通过不断实践和总结能够更高效地处理文本数据提升C程序的稳定性与性能。
http://www.pierceye.com/news/276331/

相关文章:

  • 微信 公司网站 怎么做WordPress安装在Windows
  • 商丘给企业做网站的公司已备案域名租用
  • .net商城网站模板下载网站开发怎么对接客户
  • php程序员网站开发域名企业备案对网站的好处
  • 沈阳市城乡建设网站wordpress全文
  • 冉冉科技网站建设网络教学平台网址
  • 深圳网站设计建设公司宁波易通建设网站
  • 许昌网站建设公司网站的空间和域名
  • 公司查询网站查询系统wordpress简书主题
  • 公司网站 钓鱼网站ui设计交付物都包含哪些
  • seo网站导航建设技巧精东影视传媒文化管理公司
  • 做白酒的网站怎么查网站建设是哪家公司
  • 网站域名密码免费网站推广产品
  • 网站建设一般要多少费用申请网站官网
  • 金融网站织梦模板二手车网站建设
  • 怎么自己写代码做网站做网站必须用域名吗
  • 重庆营销网站建设平台怎么添加wordpress模板
  • 网站赚取广告费深圳个人外贸网站建
  • 在线销售型的网站巢湖城市建设投资有限公司网站
  • 苏州高端网站建设设计程序源代码网站
  • 基本原理网站建设文档怎么做网站链接
  • 网站建设出售门户网站有哪些推广分类
  • 企业网站制作一般多少钱做ppt的兼职网站有哪些
  • 分公司可以建设网站淘宝联盟怎么推广
  • 苏州网站设计哪家公司好童程童美编程地址在哪里
  • 软文营销的成功案例百度优化怎么做
  • 公司网站开发怎么收费优化方案英语必修三
  • 网站改版阿里云怎么做网站301定向温州网站运营
  • 免费做简历网站有哪些网站建设与网页制作招聘
  • 怎么到国外网站去接模具订单做潍坊微信网站开发