(只有气到我肺都炸了的情况下我才可能废一些时间去写博客(主要是写一些气话),但现在气消得差不多了我也骂不出什么话了。
正文
1、字符串拼接分软拼接和硬拼接(“软硬拼接”是我自己发明的词~实际上到底有没有这种说法我就没去管了)
2、所谓软拼接,就是字符串后面加的是【字符串】;硬拼接就字符串后面加的是【字符】
3、软拼接,只会拼接'\0'之前的有效字符;硬拼接,是什么字符都能硬加进去,包括'\0'
4、硬拼接如果拼接的是'\0',在判等的时候很大概率翻车。(在map的find函数里会要用到判等的。没错我就这翻的车,查了大半天原因
不要问我,“为啥不直接字符转字符串鸭~”,自己先试试吧,等和我一样杀疯了就明白的了(“杀疯了”只是玩室友的梗而已
也不要问我,“为啥不用’to_string’这函数呀,我觉得挺好用的啊”,嗯,我也觉得挺好用的,直到在我运行时疯狂出错的时候我才发现情况不对。(to_string这玩意儿是专门给数值转字符串的,如果用在字符上,那字符会首先转成ASCII码然后再转成字符串,这说不太清,直接一段代码就明白的了
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA(to_string('A'));
cout << strA << endl;//输出结果是【65】,惊不惊喜意不意外?
//但实际上就是这样的。当仔细查看to_string()所对应的参数类型时就明白,
//这玩意儿压根就不能给字符转字符串用的
return 0;
}
【那啥软硬拼接的举例代码如下】
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA;
string strB;
strA += '\0';
strB += "\0";
if (strA == strB)
cout << "相等" << endl;//实际上这句是绝对不会命中的
//可以在debug里头看看strA和strB的内容
return 0;
}
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA;
strA += '\0';
if (strA == "\0")
cout << "相等" << endl;//明显的,这句也绝不会命中。
//那判断条件中的"\0"会转成string字符串。
//如果将判断条件改成strA==string("\0"),也没啥用,一个意思的
return 0;
}
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA;
strA += '\0';
strA += "123";
if (strcmp(strA.data(), "")==0)//strA.data()是string转字符数组char*的玩意儿,好东西来的
cout << "相等" << endl;//这句就命中了~
return 0;
}
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA("ABC");
strA += '\0';
strA += "123";
cout << strA<<endl;//输出结果是【ABC 123】,这和印象里的“遇到\0就停止输出”的不一样。
//因为“遇到\0就停止”是给字符数组用的,'\0'是字符数组的结束符
cout<<strA.data()<<endl;//这里只会输出【ABC】
return 0;
}
#include<string>
#include<iostream>
using namespace std;
int main() {
string strA;
strA += "ABC\0ABC";
strA += "123";
cout << strA;//输出结果是【ABC123】。软拼接下只会拼接\0之前的字符
return 0;
}
说到这,懂的都懂的。为啥要字符串拼接,那是因为,C++里头,压根就没有字符直接转字符串的东西(可能是有的吧,大概,,?但我没找到也不想再找了),想转就自己把字符拼接到字符串后面(但这属于硬拼接,拼接时遇到字符’\0’,妥妥地翻车预定。注意着点就好了
版权声明:本文为weixin_44733774原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。