【掌握C++ string 类】——【高效字符串操作】的【现代编程艺术】

专栏:C++学习笔记 

上一篇:【C++】——【 STL简介】——【详细讲解】

1. 为什么要学习 string 类?

1.1 C 语言中的字符串

在 C 语言中,字符串是以 '\0' 结尾的字符集合。如下所示:

#include <stdio.h>int main() {char str[] = "Hello, World!";printf("%s\n", str);return 0;
}

需要记住的知识点:

  1. C 风格字符串是以 '\0' 结尾的字符数组。
  2. 使用 char 类型数组表示字符串。
  3. C 库提供的字符串操作函数与字符串本身是分离的。

小李的理解 C 语言中的字符串处理很基础,使用字符数组来存储,但需要手动管理内存,很容易出错。

1.2 两个面试题

字符串转整形数字

题目描述:将字符串表示的数字转换为整形数字,例如将 "12345" 转换为 12345

实现方法:可以使用 std::stoi 函数将字符串转换为整形数字。

示例代码

#include <iostream>
#include <string>int main() {std::string str = "12345";try {int num = std::stoi(str); // 将字符串转换为整形数字std::cout << "字符串 \"" << str << "\" 转换为整形数字: " << num << std::endl;} catch (const std::invalid_argument& e) {std::cout << "无效的输入: " << str << std::endl;} catch (const std::out_of_range& e) {std::cout << "输入超出范围: " << str << std::endl;}return 0;
}

 

需要记住的知识点

  1. 使用 std::stoi 函数将字符串转换为整形数字。
  2. std::stoi 在转换失败时会抛出异常,可以根据需要进行异常处理。

小李的理解

使用 std::stoi 函数非常方便,可以直接将表示数字的字符串转换为整形数字。这在处理用户输入或文件读取的数据时非常有用。

字符串相加

题目描述:将两个字符串拼接成一个字符串,例如将 "Hello, ""World!" 拼接成 "Hello, World!"

实现方法:可以使用 + 运算符或者 append 方法将两个字符串拼接。

示例代码

#include <iostream>
#include <string>int main() {std::string str1 = "Hello, ";std::string str2 = "World!";// 方法1:使用 + 运算符拼接std::string result1 = str1 + str2;std::cout << "使用 + 运算符拼接: " << result1 << std::endl;// 方法2:使用 append 方法拼接std::string result2 = str1;result2.append(str2);std::cout << "使用 append 方法拼接: " << result2 << std::endl;return 0;
}

需要记住的知识点

  1. 使用 + 运算符可以方便地将两个字符串拼接。
  2. 使用 append 方法也可以实现字符串拼接,适用于更复杂的字符串操作。

小李的理解

C++ 中提供了多种字符串拼接方法,+ 运算符简单直观,适合拼接固定数量的字符串。append 方法则适合在循环或更复杂的逻辑中使用。

详细运行结果分析

字符串转整形数字

#include <iostream>
#include <string>int main() {std::string str = "12345";try {int num = std::stoi(str); // 将字符串转换为整形数字std::cout << "字符串 \"" << str << "\" 转换为整形数字: " << num << std::endl;} catch (const std::invalid_argument& e) {std::cout << "无效的输入: " << str << std::endl;} catch (const std::out_of_range& e) {std::cout << "输入超出范围: " << str << std::endl;}return 0;
}

异常处理

  • std::invalid_argument:如果输入的字符串不是一个有效的整数,则会抛出此异常。
  • std::out_of_range:如果输入的字符串表示的整数超出了整形数字的范围,则会抛出此异常。

需要注意的地方std::stoi 在处理非常大的数字时,可能会抛出 std::out_of_range 异常。

补充代码:处理无效输入和超出范围的情况

#include <iostream>
#include <string>int main() {std::string str1 = "12345";std::string str2 = "12345abc";std::string str3 = "99999999999999999999999999";try {int num1 = std::stoi(str1); // 正确转换std::cout << "字符串 \"" << str1 << "\" 转换为整形数字: " << num1 << std::endl;} catch (const std::invalid_argument& e) {std::cout << "无效的输入: " << str1 << std::endl;} catch (const std::out_of_range& e) {std::cout << "输入超出范围: " << str1 << std::endl;}try {int num2 = std::stoi(str2); // 转换失败std::cout << "字符串 \"" << str2 << "\" 转换为整形数字: " << num2 << std::endl;} catch (const std::invalid_argument& e) {std::cout << "无效的输入: " << str2 << std::endl;} catch (const std::out_of_range& e) {std::cout << "输入超出范围: " << str2 << std::endl;}try {int num3 = std::stoi(str3); // 转换失败std::cout << "字符串 \"" << str3 << "\" 转换为整形数字: " << num3 << std::endl;} catch (const std::invalid_argument& e) {std::cout << "无效的输入: " << str3 << std::endl;} catch (const std::out_of_range& e) {std::cout << "输入超出范围: " << str3 << std::endl;}return 0;
}

 字符串相加

#include <iostream>
#include <string>int main() {std::string str1 = "Hello, ";std::string str2 = "World!";// 方法1:使用 + 运算符拼接std::string result1 = str1 + str2;std::cout << "使用 + 运算符拼接: " << result1 << std::endl;// 方法2:使用 append 方法拼接std::string result2 = str1;result2.append(str2);std::cout << "使用 append 方法拼接: " << result2 << std::endl;return 0;
}

细节分析

  1. 使用 + 运算符拼接时,会生成一个新的字符串对象。
  2. 使用 append 方法拼接时,会在原有字符串对象上进行修改,适合在需要多次拼接的情况下使用以减少不必要的对象创建。

补充代码:使用多次拼接的情况

#include <iostream>
#include <string>int main() {std::string str1 = "Hello, ";std::string str2 = "World!";std::string str3 = " How are you?";// 多次使用 + 运算符拼接std::string result1 = str1 + str2 + str3;std::cout << "多次使用 + 运算符拼接: " << result1 << std::endl;// 多次使用 append 方法拼接std::string result2 = str1;result2.append(str2).append(str3);std::cout << "多次使用 append 方法拼接: " << result2 << std::endl;return 0;
}

 

通过这些详细的代码示例和运行结果分析,相信你能更好地理解如何在 C++ 中进行字符串转整形数字和字符串相加操作,并在实际应用中灵活使用这些方法。

2. 标准库中的 string

2.1 string 类的基本介绍

文档介绍

  1. string 是一个表示字符序列的类。
  2. string 类提供了丰富的接口,类似于标准容器(如 vector),但还添加了专门用于操作单字节字符字符串的设计特性。
  3. stringbasic_string 模板类的一个实例,使用 charchar_traitsallocator 作为模板参数。
  4. string 类独立于编码处理字节。

需要记住的知识点

  1. string 类表示字符序列。
  2. 提供类似于标准容器的接口。
  3. string 实际上是 basic_string<char, char_traits, allocator> 的实例。

小李的理解string 类封装了字符串操作,提供了很多方便的函数,不需要我们手动管理内存。

示例代码

#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::cout << str << std::endl;return 0;
}

2.2 string 类的常用接口

构造函数

string():构造一个空的 string 对象。

#include <iostream>
#include <string>int main() {std::string s;std::cout << "Empty string: '" << s << "'" << std::endl;return 0;
}

 string(const char* s):用 C 风格字符串构造 string 对象。

#include <iostream>
#include <string>int main() {std::string s("Hello, World!");std::cout << s << std::endl;return 0;
}

string(size_t n, char c):构造一个包含 n 个字符 cstring 对象。 

#include <iostream>
#include <string>int main() {std::string s(10, 'a');std::cout << s << std::endl;return 0;
}

string(const string& s):拷贝构造函数,用另一个 string 对象构造新对象。

#include <iostream>
#include <string>int main() {std::string s1 = "Hello";std::string s2(s1);std::cout << s2 << std::endl;return 0;
}

 

容量操作

size() / length():返回字符串的有效字符长度。

#include <iostream>
#include <string>int main() {std::string s = "Hello";std::cout << "Size: " << s.size() << std::endl;std::cout << "Length: " << s.length() << std::endl;return 0;
}

capacity():返回字符串的总容量。

#include <iostream>
#include <string>int main() {std::string s = "Hello";std::cout << "Capacity: " << s.capacity() << std::endl;return 0;
}

 empty():检测字符串是否为空,空则返回 true,否则返回 false

#include <iostream>
#include <string>int main() {std::string s;if (s.empty()) {std::cout << "String is empty" << std::endl;}return 0;
}

clear():清空字符串中的有效字符。

#include <iostream>
#include <string>int main() {std::string s = "Hello";s.clear();std::cout << "String after clear: '" << s << "'" << std::endl;return 0;
}

reserve(size_t res_arg=0):为字符串预留空间,不改变有效字符个数。

#include <iostream>
#include <string>int main() {std::string s;s.reserve(100);std::cout << "Reserved capacity: " << s.capacity() << std::endl;return 0;
}

resize(size_t n) / resize(size_t n, char c):将有效字符个数改为 n,多出的空间用字符 c 填充。

#include <iostream>
#include <string>int main() {std::string s = "Hello";s.resize(10, 'x');std::cout << "Resized string: " << s << std::endl;return 0;
}

访问及遍历操作

operator[]:返回指定位置的字符。

#include <iostream>
#include <string>int main() {std::string s = "Hello";std::cout << "Character at index 1: " << s[1] << std::endl;return 0;
}

begin() / end():返回字符串的起始迭代器和结束迭代器。

#include <iostream>
#include <string>int main() {std::string s = "Hello";for (auto it = s.begin(); it != s.end(); ++it) {std::cout << *it << ' ';}std::cout << std::endl;return 0;
}

 rbegin() / rend():返回反向迭代器。

#include <iostream>
#include <string>int main() {std::string s = "Hello";for (auto it = s.rbegin(); it != s.rend(); ++it) {std::cout << *it << ' ';}std::cout << std::endl;return 0;
}

 范围 for 循环:C++11 引入的简洁遍历方式。

#include <iostream>
#include <string>int main() {std::string s = "Hello";for (char c : s) {std::cout << c << ' ';}std::cout << std::endl;return 0;
}
修改操作

1.push_back(char c):在字符串末尾添加字符 c

#include <iostream>
#include <string>int main() {std::string s = "Hello";s.push_back('!');std::cout << s << std::endl;return 0;
}

2.append(const string& str):在字符串末尾追加字符串 str。 

#include <iostream>
#include <string>int main() {std::string s = "Hello";s.append(" World");std::cout << s << std::endl;return 0;
}

3.operator+=:在字符串末尾追加字符串。

#include <iostream>
#include <string>int main() {std::string s = "Hello";s += " World";std::cout << s << std::endl;return 0;
}

 

4.c_str():返回 C 风格字符串。

#include <iostream>
#include <string>int main() {std::string s = "Hello";const char* c_str = s.c_str();std::cout << c_str << std::endl;return 0;
}

 

5.find(char c, size_t pos=0):从指定位置开始查找字符 c

#include <iostream>
#include <string>int main() {std::string s = "Hello";size_t pos = s.find('l');if (pos != std::string::npos) {std::cout << "Character 'l' found at position: " << pos << std::endl;} else {std::cout << "Character not found" << std::endl;}return 0;
}

 

6.rfind(char c, size_t pos=npos):从指定位置开始反向查找字符 c

#include <iostream>
#include <string>int main() {std::string s = "Hello";size_t pos = s.rfind('l');if (pos != std::string::npos) {std::cout << "Character 'l' found at position: " << pos << std::endl;} else {std::cout << "Character not found" << std::endl;}return 0;
}

 

7.substr(size_t pos=0, size_t n=npos):返回从指定位置开始的子字符串。 

#include <iostream>
#include <string>int main() {std::string s = "Hello, World!";std::string sub = s.substr(7, 5); // 从第7个位置开始,取5个字符std::cout << "Substring: " << sub << std::endl;return 0;
}

非成员函数

1.operator+:字符串拼接。

#include <iostream>
#include <string>int main() {std::string s1 = "Hello";std::string s2 = " World";std::string s3 = s1 + s2;std::cout << s3 << std::endl;return 0;
}

 

2.operator>>:输入运算符重载。 

#include <iostream>
#include <string>int main() {std::string s;std::cout << "Enter a string: ";std::cin >> s; // 从输入读取字符串,遇到空格结束std::cout << "You entered: " << s << std::endl;return 0;
}

3.operator<<:输出运算符重载。 

#include <iostream>
#include <string>int main() {std::string s = "Hello, World!";std::cout << s << std::endl; // 输出: Hello, World!return 0;
}

4.getline:读取一行字符串。 

#include <iostream>
#include <string>int main() {std::string line;std::cout << "Enter a line of text: ";std::getline(std::cin, line); // 从输入读取一行字符串std::cout << "You entered: " << line << std::endl;return 0;
}

5.关系运算符:字符串比较。 

#include <iostream>
#include <string>int main() {std::string s1 = "Hello";std::string s2 = "World";if (s1 < s2) {std::cout << s1 << " is less than " << s2 << std::endl;} else {std::cout << s1 << " is not less than " << s2 << std::endl;}return 0;
}

3. 扩展阅读

需要记住的知识点

  1. string 类是 basic_string 模板类的实例。
  2. 提供丰富的接口,简化字符串操作。
  3. 内存管理由 string 类自动处理,避免了手动管理内存的复杂性和风险。

小李的理解 string 类让字符串操作变得简单而安全。通过理解 string 类的各种接口和功能,可以更高效地编写 C++ 程序。

示例代码

找字符串中第一个只出现一次的字符

#include <iostream>
#include <string>class Solution {
public:int firstUniqChar(const std::string& s) {int count[256] = {0};for (char c : s) {count[c]++;}for (size_t i = 0; i < s.size(); ++i) {if (count[s[i]] == 1) {return i;}}return -1;}
};int main() {Solution solution;std::string s = "leetcode";int index = solution.firstUniqChar(s);if (index != -1) {std::cout << "The first unique character is at index: " << index << std::endl;} else {std::cout << "No unique character found" << std::endl;}return 0;
}

 

验证一个字符串是否是回文 

#include <iostream>
#include <string>
#include <algorithm>class Solution {
public:bool isPalindrome(const std::string& s) {std::string filtered;for (char c : s) {if (isalnum(c)) {filtered += tolower(c);}}std::string reversed = filtered;std::reverse(reversed.begin(), reversed.end());return filtered == reversed;}
};int main() {Solution solution;std::string s = "A man, a plan, a canal: Panama";bool result = solution.isPalindrome(s);if (result) {std::cout << "\"" << s << "\" is a palindrome" << std::endl;} else {std::cout << "\"" << s << "\" is not a palindrome" << std::endl;}return 0;
}

总结 

1. 为什么要学习 string 类?

C 语言中的字符串

  • C 风格字符串是以 '\0' 结尾的字符数组,使用 char 类型数组表示。
  • C 库提供的字符串操作函数与字符串本身是分离的,需要手动管理内存,容易出错。

字符串转整形数字

  • 使用 std::stoi 函数可以方便地将字符串转换为整形数字。
  • std::stoi 在转换失败时会抛出异常,可以进行异常处理。

字符串相加

  • 使用 + 运算符和 append 方法可以轻松实现字符串拼接。
  • + 运算符适合拼接固定数量的字符串,append 方法适合在循环或复杂逻辑中使用。

2. 标准库中的 string

基本介绍

  • string 类表示字符序列,提供类似于标准容器的接口。
  • string 实际上是 basic_string<char, char_traits, allocator> 的实例,封装了字符串操作,提供方便的函数和自动内存管理。

常用接口

构造函数
  • string():构造一个空的 string 对象。
  • string(const char* s):用 C 风格字符串构造 string 对象。
  • string(size_t n, char c):构造一个包含 n 个字符 cstring 对象。
  • string(const string& s):拷贝构造函数,用另一个 string 对象构造新对象。
容量操作
  • size() / length():返回字符串的有效字符长度。
  • capacity():返回字符串的总容量。
  • empty():检测字符串是否为空。
  • clear():清空字符串中的有效字符。
  • reserve(size_t res_arg=0):为字符串预留空间。
  • resize(size_t n) / resize(size_t n, char c):将有效字符个数改为 n,多出的空间用字符 c 填充。
访问及遍历操作
  • operator[]:返回指定位置的字符。
  • begin() / end():返回字符串的起始迭代器和结束迭代器。
  • rbegin() / rend():返回反向迭代器。
  • 范围 for 循环:C++11 引入的简洁遍历方式。
修改操作
  • push_back(char c):在字符串末尾添加字符 c
  • append(const string& str):在字符串末尾追加字符串 str
  • operator+=:在字符串末尾追加字符串。
  • c_str():返回 C 风格字符串。
  • find(char c, size_t pos=0):从指定位置开始查找字符 c
  • rfind(char c, size_t pos=npos):从指定位置开始反向查找字符 c
  • substr(size_t pos=0, size_t n=npos):返回从指定位置开始的子字符串。
非成员函数
  • operator+:字符串拼接。
  • operator>>:输入运算符重载。
  • operator<<:输出运算符重载。
  • getline:读取一行字符串。
  • 关系运算符:字符串比较。

3. 扩展阅读

  • string 类是 basic_string 模板类的实例,提供丰富的接口,简化字符串操作。
  • 内存管理由 string 类自动处理,避免了手动管理内存的复杂性和风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1475103.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI产品经理必懂的13种技术

AI产品经理和互联网产品经理一样&#xff0c;也会面临要不要懂技术&#xff0c;懂什么技术&#xff0c;到什么程度的问题&#xff0c;本章针对这一常见问题给出了解答。 AI产品经理一定要懂技术&#xff0c;懂技术重点是要懂产品方案包含的AI算法、数据、算力及硬件的相关技术…

nftables(2)表、链、规则查询和管理(新增、插入、修改、删除)

简介 在上篇文章中&#xff0c;我们介绍了nftables基本原理以及与iptables的区别&#xff0c;nftables安装和配置保存的操作。这篇文章主要介绍nftables的基本操作&#xff0c;表、链、规则的新增、插入、修改、删除等操作。 注意&#xff1a;在进行nftables实验时和iptables…

AI自动生成PPT怎么用?看完这篇文章你就知道啦

小暑&#xff0c;作为夏季的第五个节气&#xff0c;标志着炎炎夏日的正式到来。在这个时节&#xff0c;阳光明媚&#xff0c;万物生长&#xff0c;人们的心情也随着气温的升高而变得热烈。 然而&#xff0c;对于许多职场人士来说&#xff0c;小暑的到来也意味着需要准备各种汇报…

spark shuffle写操作——SortShuffleWriter

写入的简单流程&#xff1a; 1.生成ExternalSorter对象 2.将消息都是插入ExternalSorter对象中 3.获取到mapOutputWriter&#xff0c;将中间产生的临时文件合并到一个临时文件 4.生成最后的data文件和index文件 可以看到写入的重点类是ExternalSorter对象 ExternalSorter 基…

包装类的128陷阱

我们先看一段代码 Integer num1100; Integer num2100; System.out.println(num1 num2); //trueInteger num3128; Integer num4128; System.out.println(num3 num4); //false 在执行之后&#xff0c;我们会发现num1num2是true&#xff0c;而num3num4却是false&#xff0c;…

Thingsboard 系列之通过 ESP8266+MQTT 模拟设备上报数据到平台

前置工作 Thingsboard平台ESP 8266 NodeMCU 开发板IDE&#xff1a; Arduino 或 VScode 均可 服务端具体对接流程 系统管理员账号通过 Thingsboard 控制面板创建租户等信息并以租户账号登录 实体 —> 设备维护具体设备信息 创建完成后通过管理凭据修改或直接复制访问令牌…

实力上榜!Coremail连续5年入选中国网络安全市场全景图

7月4日&#xff0c;网络安全行业研究机构数说安全正式发布《2024年中国网络安全市场全景图》&#xff08;以下简称“全景图”&#xff09;&#xff0c;这是自2018年开始&#xff0c;数说安全发布的第七版全景图。 作为国内头部电子邮件产品与解决方案提供商&#xff0c;Coremai…

Linux基础: 二. Linux的目录和文件

文章目录 二. Linux的目录和文件1.1 目录概要1.2 目录详细说明 二. Linux的目录和文件 1.1 目录概要 command&#xff1a;ls / Linux的文件系统像一棵树一样&#xff0c;树干是根目录&#xff08;/&#xff09;&#xff0c;树枝是子目录&#xff0c;树叶是文件&#xff1b; …

Qt 网络编程实战

一.获取主机的网络信息 需要添加network模块 QT core gui network主要涉及的类分析 QHostInfo类 QHostInfo::localHostName() 获取本地的主机名QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口 QNetworkInterface类 QNetworkInterfac…

AI绘画Stable Diffusion:超强InstantID插件—面部特征一致性风格保持与迁移,轻松搞定私人写真摄影,SDWebUI使用指南

大家好&#xff0c;我是设计师阿威 最近经常有同学问到AI绘画Stable Diffusion 关于风格迁移IPA、Instant ID等安装和使用方法&#xff0c;内容虽基础但也属常用工具。因此&#xff0c;本文将核心介绍Instant ID 使用和墨幽人造人XL体验&#xff08;这是一款可出图商用的写实摄…

uniapp微信小程序端实现微信登录

从网上看了一些&#xff0c;好像说是要先调用uni.getUserProfile 或者uni.getUserInfo获取用户信息后&#xff0c;然后再调用uni.login才行&#xff0c;但是我看着uni.getUserProfile和uni.getUserInfo 返回的都是一些匿名信息&#xff08;nickName: "微信用户", 头像…

经济寒冬:竞品凶猛,你的产品如何求生?

那些年曾被竞品干掉的产品 1997年到2010年左右是国内互联网行业的快速发展和多元化发展的时期&#xff0c;这一时期涌现出来一大批优秀的产品&#xff0c;市场竞争越来越激烈。苹果 在20 世纪 80 年代&#xff0c;乔布斯的苹果电脑&#xff0c;在当时可是PC行业的老大&#xf…

tessy 单元测试:小白入门指导手册

目录 1,创建单元测试工程目录 2,导入单元测试源文件 一:创建测试文件夹(最好和代码目录一一对应,方便查找) 二:选择测试环境 三:添加源文件 四:分析源文件 3,编写单元测试用例 一:设置函数参数的传输方向 二:添加单元测试用例 三:编辑单元测试用例数据 …

Kafka抛弃Zookeeper后如何启动?

Kafaka如何下载 官网地址 目前Kafka最新的版本就是3.7.1 我们可以看到下面这两个版本信息&#xff1f;什么意思呢&#xff1f; Scala 2.12 - kafka_2.12-3.7.1.tgz (asc, sha512)Scala 2.13 - kafka_2.13-3.7.1.tgz (asc, sha512) 我们应该知道&#xff0c;一个完整的Kafka实…

互联网十万个为什么之什么是数据备份?

数据备份是按照一定的备份频率创建数据副本的过程&#xff0c;将重要的数据复制到其它位置或者存储介质&#xff0c;并对生成的副本保留一定的时长。备份通常储存在不同的物理介质或云端&#xff0c;以确保数据的连续性和完整性。有效的备份策略至关重要&#xff0c;以防止数据…

c#类型转换和常见集合类型

目录 1. 整数转换&#xff0c;整数和字符串&#xff0c;字符串和整数之间的转换怎么实现&#xff1f; 2. 日期转换&#xff0c;获取当前日期&#xff0c;字符串转日期&#xff0c;日期转字符串怎么实现&#xff1f; 3. 举例一维、二维、三维数组 4. 需求&#xff1a;有个88…

07浅谈大语言模型可调节参数tempreture

浅谈temperature 什么是temperature&#xff1f; temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性&#xff1a; 控制确定性&#xff1a; temperature参数可以控制模型生成文本的确定性&#xff0c;大部分模型中temperatur…

《C++20设计模式》命令模式思考

文章目录 一、前言二、分析 拆解1、经典命令模式2、撤销操作3、关于Invoker类 三、实现 一、前言 哎&#xff01;只要是书上写的和经典设计模式不同&#xff0c;我就会很伤脑筋。&#x1f629; 命令模式到底是干什么的&#xff1f; 答&#xff1a;命令的发送者和接收者完全解…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景&#xff1a; 公司的某个sqlserver服务器要做迁移&#xff0c;由于该sqlserver服务器上数据库很多&#xff0c;并且做了很多的job和维护计划&#xff0c;重新安装的sqlserver这些都是空的&#xff0c;于是就想到了把系统4个系统数据库进行替换&#xff0c;然后也把…

应用在灯带Type-C接口上的PD SINK协议芯片ECP5701/ECP5702获取充电器的5V、9V、12V、15V、20V供电

方案背景 近日&#xff0c;欧盟就统一充电器接口的提案达成了一项政治协议&#xff0c;其中规定了在欧盟地区销售的所有手机或其他便携式中小型电子设备必须采用统一的USB Type-C接口。这项决定意味着未来将会有更多的产品强制性地使用TYPE-C充电接口。 在这个背景下&#xf…