C++之String类(下)

片头

       嗨喽~ 我们又见面啦,在上一篇C++之String类(上)中,我们对string类的函数有了一个初步的认识,这一篇中,我们将继续学习string类的相关知识。准备好了吗?咱们开始咯~

二、标准库中的string类

2.5 string类对象的修改操作
函数名称功能说明
push back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
assign给字符串原有的内容进行覆盖,类似于赋值
insert用于在字符串的pos位置插入一个字符串、字符串的前n个字符或n个字符c
erase用于在字符串的pos位置删除len个字符
replace替换源字符串中的字符
c str返回c格式字符串
rfind + npos从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
find从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
swap用于交换2个string类对象
operator+返回一个新构造的string类对象,其值是lhs和rhs的合并
getline用于字符串的输入

(1)push back函数 

我们测试一下:

void test_string15() {string s1("hello world");cout << s1 << endl;//在s1字符串的后面尾插'x's1.push_back('x');cout << s1 << endl;
}


(2)append函数

我们测试一下:

void test_string16() {string s1("hello world");cout << s1 << endl;//在s1字符串的后面追加一个字符串s1.append(" yyyyyy!!!!");cout << s1 << endl;
}

(3)此外,我们还可以使用运算符operator+=函数重载

代码如下:

void test_string17() {string s1("hello world");cout << s1 << endl;string s2("111111");//在s1字符串的后面追加一个字符串s1 += 'y';s1 += "zzzzzzzzzzz";s1 += s2;cout << s1 << endl;
}

注意:

①在string尾部追加字符时,s.push_back(c)/s.append(1,c)/s += 'c' 三种的实现方式差不多,一般情况下,string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串

②对string操作时,如果能够大概预估到放多少字符,可以先通过reverse把空间预留好


(4)assign函数

assign函数类似于给字符串原有的内容进行覆盖,类似于赋值

void test_string18() {string s1("hello world");cout << s1 << endl;s1.assign("11111");cout << s1 << endl;
}

  


 (5)insert函数

①在s1字符串前头插"xxxxx"  

void test_string19() {string s1("hello world");cout << s1 << endl;//在s1字符串前头插"xxxxx"s1.insert(0, "xxxxx");cout << s1 << endl;
}

 ②在s1字符串前头插一个字符'y'

void test_string20() {string s1("hello world");cout << s1 << endl;//在s1字符串前头插单个字符'y's1.insert(0, 1,'y');cout << s1 << endl;
}

③使用迭代器,在s1字符串钱头插单个字符'y'

void test_string21() {string s1("hello world");cout << s1 << endl;//在s1字符串前头插单个字符'y's1.insert(s1.begin(), 'y');cout << s1 << endl;
}

  ④在s1字符串前插入s2字符串,二者都采用迭代器的形式

void test_string22() {string s1("hello world");cout << s1 << endl;string s2("11111");//在s1字符串前头插s2字符串s1.insert(s1.begin(),s2.begin(),s2.end());cout << s1 << endl;
}


 (6)erase函数

①当pos=0,len=1,说明,从下标为0的元素开始,删除1个字符

void test_string23() {string s1("hello world");cout << s1 << endl;//从下标为0的元素开始,删除1个字符s1.erase(0, 1);cout << s1 << endl;
}

  

②当我不传第二个参数的时候,len默认为npos

void test_string24() {string s1("hello world");cout << s1 << endl;//省略第二个参数//默认删除从下标为4后的所有元素//包括下标为4的元素s1.erase(4);cout << s1 << endl;
}

③当我传入的第二个参数len大于字符串本身的长度时

void test_string25() {string s1("hello world");cout << s1 << endl;//从下标为3的位置开始,//删除100个元素s1.erase(3, 100);cout << s1 << endl;
}

 

另外,使用erase函数时,第二个参数len可以不合法,但是第一个参数pos必须合法!


(7)replace函数

哇哦,咋一看,这个函数怎么有这么多的用法?!

不慌,我们慢慢来看~

 ①string& replace(size_t pos,size_t len,const string& str);

void test_string27() {string s1("hello world");cout << s1 << endl;//将下标为5的位置,1个字符//替换为20%s1.replace(5, 1, "20%");cout << s1 << endl;
}

小练习:将下面字符串中出现的空白字符替换为"20%"

void test_string28() {string s1("hello world hello bit");cout << s1 << endl;for (int i = 0; i < s1.size();) {if (s1[i] == ' ') {s1.replace(i, 1, "20%");i += 3;}else {i++;}}cout << s1 << endl;
}

或者可以用另一种解法:

void test_string29() {string s1("hello world hello bit");cout << s1 << endl;string s2;//使用范围forfor (auto e : s1) {if (e != ' ') {s2 += e;}else {s2 += "20%";}}cout << s2 << endl;
}

(8) c_str函数

const char* c_str() const;

 按照C语言的格式返回字符串

例如:

void test_string38() {string s1("hello");s1 += '\0';s1 += "world";cout << s1 << endl;cout << s1.c_str() << endl;
}

在hello后面加上'\0'和字符串world,重载后的流插入操作符函数会按照size的大小来打印字符串

而打印c_str的返回值,会遇到'\0'就停下

(9) rfind + npos函数

size_t rfind(char c,size_t pos = npos)const;

static const size_t npos = -1;

从字符串的pos位置向前找字符c,返回该字符在字符串中的位置

npos是string类中定义的一个静态成员变量,类型为无符号整型,值为-1,因为是无符号转换后变成整型的最大值,也就是4294967295(42亿多) ,当我们不给pos的值,按照缺省值执行,默认从字符串尾部开始寻找。

例如:

void test_string39() {string s1("hello");//从后往前寻找第一次出现的'l'cout << s1.rfind('l') << endl;
}

(10) find函数

size_t find (char c,size_t pos = 0) const;

 从字符串的pos位置向后找字符c,返回该字符在字符串中的位置

例如:

void test_string40() {string s1("hello");//从前往后寻找第一次出现的'e'cout << s1.find('e') << endl;
}

 (11)substr函数

string substr (size_t pos = 0,size_t len = npos);

 在str中从pos位置开始,截取len个字符,然后将其返回

例如:

void test_string41() {string s1("hello world!");//从下标为0的元素开始,截取5个字符string s2 = s1.substr(0, 5);cout << s2 << endl;
}

(12) swap函数

void swap (string& str);

用于交换2个string类对象

string类中的swap函数相比标准库中的swap函数,交换string类对象的效率更高

例如:

void test_string42() {string s1("hello");string s2("world!");//将s1字符串和s2字符串进行交换s1.swap(s2);cout << s1 << endl;cout << s2 << endl;
}

(13) operator+ 函数

string operator+ (const string& lhs,const string& rhs);

string operator+ (const string& lhs,const char* rhs);

string operator+ (const char* lhs,const char* rhs);

string operator+ (const string& lhs,char rhs);

string operator+ (char lhs,const string& rhs);

 返回一个新构造的string类对象,其值是lhs和rhs的合并

例如:

void test_string43() {string s1("hello");string s2("world!");string s3;s3 = s1 + s2;cout << s3 << endl;s3 = s1 + "123";cout << s3 << endl;s3 = "123" + s2;cout << s3 << endl;s3 = s1 + "x";cout << s3 << endl;s3 = 'x' + s1;cout << s3 << endl;
}

(14)getline函数

istream& getline(istream& is,string& str,char delim);

istream& getline(istream& is,string& str);

 用于字符串的输入

相比cin遇到空格就停止读取,我们可以给出分隔符delim,遇到delim才停止读取。如果没有给出,则遇到换行停止读取。

例如:

void test_string44() {string s1;//没有给出分隔符delim//遇到换行,停止读取getline(cin, s1);cout << s1 << endl;//给出分隔符'%'//遇到分隔符,停止读取getline(cin, s1, '%');cout << s1 << endl;
}

 

2.6 各种运算符重载函数

(1)operator>>和operator<<

istream& operator>>(istream& is,string& str);

ostream& operator<<(ostream& os,const string& str);

用于string对象的流提取和流插入

例如:

void test_string45() {string s1;cin >> s1;cout << s1 << endl;
}

 

(2)比较运算符

用于比较2个字符串的对应位置的ASCII码值大小

例如:

void test_string46() {string s1("abcde");string s2("bbcde");cout << (s1 > s2) << endl;cout << (s1 >= s2) << endl;cout << (s1 < s2) << endl;cout << (s1 <= s2) << endl;cout << (s1 == s2) << endl;cout << (s1 != s2) << endl;
}


刚刚我们学习了这么多的函数,一起来练练几道题吧~

小练习1:反转字符串

emmm,这道题是想表达什么意思呢?举2个例子吧~

OK,本题分析完成,具体代码如下:

class Solution {
public:void reverseString(vector<char>& s) {int begin = 0;          //begin从下标为0的位置开始int end = s.size()-1;   //end从最后一个元素的下标开始while(begin < end)      //当begin和end相遇时,退出循环{//交换int temp = s[begin];s[begin] = s[end];s[end] = temp;begin++;            //begin更新    end--;              //end更新}}
};

小练习2:仅仅反转字母

emmm,这道题和上面反转字符串很像,但是不太一样,因为这道题,字符串里面不仅有字母,还有其他符号。我们要做的,只是将字母反转,其他符号的位置不变。

第一步,我们首先要判断当前字符是否为字母还是其他符号:

//判断当前字符是否为字母
//注意:用短路或来连接
bool isLetter(char c)
{return c >= 'A' && c <= 'Z'||         c >= 'a' && c <= 'z';
}

第二步,反转字母(定义begin和end,如果遇到字母,进行交换,否则直接跳过)

string reverseOnlyLetters(string s) {int begin = 0;          //begin指向第一个元素的位置int end = s.size()-1;   //end指向最后一个元素的位置while(begin < end)      //当begin和end相遇时,退出循环{   //当前字符不是字母,直接跳过,不需要反转while(begin < end && !isLetter(s[begin])){begin++;}while(begin < end && !isLetter(s[end])){end--;}//当前字符为字母,需要反转,进行交换int temp = s[begin];s[begin] = s[end];s[end] = temp;//交换完毕后,begin更新,end也更新begin++;end--;}return s;   //最后返回s字符串}

小练习3:字符串中的第一个唯一字符

emmm,举个例子呗~

另外,这道题特别说明了:1<=s.length<=10^5,s只包括小写字母

第一步,我们需要给26个小写字母开辟数组,数组的类型为int(开辟空间足够大)

 //给26个小写字母开辟空间,初始化为0int count[26] = {0};

第二步,我们需要统计字符串中的每个字符出现的次数

//利用范围for,统计字符串中的每个字符出现的次数
//这里的count数组里面的元素是按照顺序的
//比如:下标为0是'a',下标为1是'b',下标为2是'c'for(auto e: s){count[e-'a']++;
}

第三步:遍历s字符串,找出第一次出现唯一字符

 //遍历s字符串,找出第一次出现的唯一字符//如果找到了,立即返回下标for(int i = 0;i<s.size();i++){if(count[s[i]-'a'] == 1){return i;}}//如果没有找到,返回-1return -1;

OK,本题完整代码如下:

class Solution {
public:int firstUniqChar(string s) {//给26个小写字母开辟空间,初始化为0int count[26] = {0};//利用范围for,统计字符串中的每个字符出现的次数//这里的count数组里面的元素是按照顺序的//比如:下标为0是'a',下标为1是'b',下标为2是'c'for(auto e: s){count[e-'a']++;}//遍历s字符串,找出第一次出现的唯一字符//如果找到了,立即返回下标for(int i = 0;i<s.size();i++){if(count[s[i]-'a'] == 1){return i;}}//如果没有找到,返回-1return -1;}
};

方法二:直接将字符串放入另一个数组中,统计字符串中的第一个唯一字符

class Solution {
public:int firstUniqChar(string s) {//开辟数组,初始化为0int count[256] = {0};//将s字符串里面的每一个元素都放入数组//相同的字符,每放入1次,该下标对应的值自增1次for(int i = 0; i<s.size();i++){count[s[i]]++;}//遍历s字符串,找出第一次出现的唯一字符for(int i = 0;i<s.size();i++){if(count[s[i]] == 1){return i;}}return -1;}
};

小练习4:验证回文串

emmm,举个例子吧~

第一步:判断是否为字母数字字符

    //1.判断是否为字母数字字符bool isLetterOrNumber(char c){return c >= '0' && c <= '9'||     c >= 'a' && c <= 'z'||     c >= 'A' && c <= 'Z';}

第二步:将所有的大写字母转换为小写字母(使用范围for时,必须传引用,这样才能保证修改e的同时,修改源字符串)

         //1.大写字符转换为小写字符for(auto& e:s){if(e >= 'A' && e<= 'Z'){e += 32;}}

第三步:验证是否为回文串

 //2.验证是否为回文串int begin = 0;         //begin指向第一个元素int end = s.size()-1;  //end指向最后一个元素while(begin < end)     //当begin和end相遇时,循环停止{//遇到非字母数字字符时,直接跳过while(begin < end && !isLetterOrNumber(s[begin])){begin++;}while(begin < end && !isLetterOrNumber(s[end])){end--;}//2个字母数字字符进行比较//如果不相同,返回false//如果相同,begin++,end--if(s[begin] != s[end]){return false;}else{begin++;end--;}}//比较完毕,begin和end指向的元素都相同,返回truereturn true;

OK,本题完整代码如下:

class Solution {
public://1.判断是否为字母数字字符bool isLetterOrNumber(char c){return c >= '0' && c <= '9'||     c >= 'a' && c <= 'z'||     c >= 'A' && c <= 'Z';}bool isPalindrome(string s) {//1.大写字符转换为小写字符for(auto& e:s){if(e >= 'A' && e<= 'Z'){e += 32;}}//2.验证是否为回文串int begin = 0;         //begin指向第一个元素int end = s.size()-1;  //end指向最后一个元素while(begin < end)     //当begin和end相遇时,循环停止{//遇到非字母数字字符时,直接跳过while(begin < end && !isLetterOrNumber(s[begin])){begin++;}while(begin < end && !isLetterOrNumber(s[end])){end--;}//2个字母数字字符进行比较//如果不相同,返回false//如果相同,begin++,end--if(s[begin] != s[end]){return false;}else{begin++;end--;}}//比较完毕,begin和end指向的元素都相同,返回truereturn true;}
};

小练习5:字符串相加

emmm,举个例子吧~

面对这种题,该怎么做呢?

题目要求:不能使用任何内建的用于处理大整数的库,也不能直接将输入的字符串转换为整数形式

那我们可以把字符串拆成个位,十位,百位......然后将个位和个位相加,十位和十位相加,百位和百位相加

第一步:我们先将num1和num2字符串的最后一个元素取出来,保存到end1和end2

    int end1 = num1.size()-1;//end1保存的是num1字符串的最后一位(个位)int end2 = num2.size()-1;//end2保存的是num2字符串的最后一位(个位)

第二步:假设变量next表示进位,字符串s表示累加的最终结果。我们将num1和num2的个位数由字符转换为数字,进行相加,注意要处理进位的情况。

            int next = 0;   //进位string s;       //返回的最终结果//当end1和end2都不存在时,退出循环,用短路或来连接while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--]-'0' : 0;//x1表示把当前字符转换为数字int x2 = end2 >= 0 ? num2[end2--]-'0' : 0;//x2表示把当前字符转换为数字int x = x1+x2+next;//x表示2个位数进行累加的结果next = x/10;      //进位x = x % 10;       //对应位上的数s.insert(0,1,'0'+x);//头插,将数字转换为字符//s.insert(s.begin(),'0'+x);//使用迭代器}if(next == 1)       //当进位为1,直接在字符串s的前面头插"1"{s.insert(0,1,'1');// s.insert(s.begin(),'0'+x);//使用迭代器}return s;           //返回s字符串

OK,这道题我们解决了,完整代码如下:

class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size()-1;//end1保存的是num1字符串的最后一位(个位)int end2 = num2.size()-1;//end2保存的是num2字符串的最后一位(个位)int next = 0;   //进位string s;       //返回的最终结果//当end1和end2都不存在时,退出循环,用短路或来连接
while(end1 >= 0 || end2 >= 0){
int x1 = end1 >= 0 ? num1[end1--]-'0' : 0;//x1表示把当前字符转换为数字
int x2 = end2 >= 0 ? num2[end2--]-'0' : 0;//x2表示把当前字符转换为数字
int x = x1+x2+next;//x表示2个位数进行累加的结果next = x/10;      //进位x = x % 10;       //对应位上的数s.insert(0,1,'0'+x);//头插,将数字转换为字符//s.insert(s.begin(),'0'+x);//使用迭代器}if(next == 1)       //当进位为1,直接在字符串s的前面头插"1"{s.insert(0,1,'1');// s.insert(s.begin(),'0'+x);//使用迭代器}return s;           //返回s字符串}
};

不过,每次插入要挪动数据,插入N次,挪动次数合计是等差数列。头插的时间复杂度为O(n^2),我们可以选择尾插,最后逆置。


片尾

今天我们把string类的函数掌握的差不多了,又练习了几道题,希望对大家有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MYSQL】授权远程连接的用户

文章目录 一、Navicat新建查询1.点击新建查询&#xff0c;授权远程连接的用户语句&#xff1a;2.刷新权限 二、Navicat用户 一、Navicat新建查询 1.点击新建查询&#xff0c;授权远程连接的用户语句&#xff1a; GRANT ALL PRIVILEGES ON *.* TO 库的用户名授权IP IDENTIFIED …

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程&#xff1f;如何使用php email服务&#xff1f; 无论是用户注册、密码重置&#xff0c;还是订单确认&#xff0c;电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能&#xff0c;并提供一些配置技巧&#xff0c;帮助你更好…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化&#xff08;Pooling&#xff09;是深度学习中常用的一种操作&#xff0c;用于降低卷积神经网络&#xff08;CNN&#xff09;或循环神经网…

《软件工程概论》作业一:新冠疫情下软件产品设计(小区电梯实体按钮的软件替代方案)

课程说明&#xff1a;《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论&#xff08;第6版&#xff09;》&#xff08;张海藩等编著&#xff0c;清华大学出版社&#xff09;作为教材。以《软件设计文档国家标准GBT8567-2006》…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大&#xff0c;越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力&#xff0c;进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言&#xff0c;在众多问题中&#xff0c;属本地生活服务项…

springboot中有哪些方式可以解决跨域问题

文章目录 什么是跨域解决方案CrossOrigin注解实现WebMvcConfigurer接口CorsFilter过滤器如何选择&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Talk is cheap &#xff0…

算法专题二: 滑动窗口

目录 1. 长度最小的子数组2. 无重复字符的最长子串3. 最大连续1的格数Ⅲ4. 将x减到0的最小操作数5. 水果成篮6. 找到字符串中所有字母异位词7. 串联所有单词的子串8. 最小覆盖子串 1. 长度最小的子数组 题目思路: 首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端…

婚恋交友小程序的设计思路与用户体验优化

在数字化时代&#xff0c;婚恋小程序作为一种新兴的婚恋交友平台&#xff0c;正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路&#xff0c;还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

ELK--收集日志demo

ELK--收集日志demo 安装ELK日志收集配置启动容器springboot配置测试 之前项目多实例部署的时候&#xff0c;由于请求被负载到任意节点&#xff0c;所以查看日志是开多个终端窗口。后来做了简单处理&#xff0c;将同一项目的多实例日志存入同一个文件&#xff0c;由于存在文件锁…

景联文科技精准数据标注:优化智能标注平台,打造智能未来

景联文科技是一家致力于为人工智能提供全面数据标注解决方案的专业公司。 拥有一支由经验丰富的数据标注师和垂直领域专家组成的团队&#xff0c;确保数据标注的质量和专业性。 自建平台功能一站式服务平台&#xff0c;提供从数据上传、标注、审核到导出的一站式服务&#xff0…

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一&#xff1a;迭代 234 回文链表方法一&#xff1a;将值复制到数组中方法二&#xff1a;快慢指针 141 环形链表方法一&#xff1a;哈希表方法二&#xff1a;快慢指针 142 环形链表II方法一&#xff1a…

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集&#xff0c;则需要把模型变复杂。如果是噪音较大&#xff0c;则需要做特征工程。 随机种子的知识点补充&#xff1a; 根据不同库中的随机过程&#xff0c;需要用对应的随机种子&#xff1a; 比如 llist(range(5)) random.shuf…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南

使用 SSH 连接 Docker 服务器&#xff1a;IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下&#xff0c;通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问&#xff0c;用户可以安全地远程操作…

python画图|自制渐变柱状图

在前述学习过程中&#xff0c;我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战&#xff0c;因此&#xff0c;本文尝试做一些渐变设计。 前述学习记录可查看链接&#xff1a; Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现&#xff08;针对上一篇sku&#xff09; 1、效果展示2、数据库设计3、后端源码3.1 application.yml 方便 AliOssUtil.java 读取3.2 model 层3.2.1 BaseEntity3.2.1 GoodsType3.2.3 GoodsTypeSonVo3.3 Controll…

24 Vue3之集成TailwindCSS

Tailwind CSS Tailwind CSS是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - Tailwind CSS - 只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网 对于PostCSS…

使用root账号ssh登录虚拟机ubuntu

在C:\Users\Administrator\.ssh目录下的config中&#xff0c;添加ubuntu会在根目录中&#xff0c;建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中&#xff0c;把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹&#xff0c;就可以不需要在ubu…