终于到C++的std::string类了,string类可以提供C中字符串的相同功能而不需要关心内存分配与释放。对于C程序员来说,可能马上就会有一个疑问(包括我在内):我在C中使用<cstring>中的字符串功能,用得得心应手,为什么要学习C++的string类呢?这就牵扯到一个根本性的问题,可能最直接的回答是:<cstring>中的字符串中的内存需要自己分配与释放,容易出现内存渗漏,另一方马上就会说,我自己申请的内存,我当然会释放,也给我带来了很大的方便性,我想怎么操作就怎么操作,你都给我包起来了,我还不相信你的效率呢,扒拉扒拉,如此循环往复,也争不出个所以然来......。所以这边我想说的是,C作为这么长期流行的编程语言,自有其存在的价值,C++能在C这个巨人的肩膀上发扬光大,也自有其道理,我们不去争孰优孰劣。既然我们要学习C++,又是在C的基础上进行学习,就要有学习新知识的勇气与魄力,而不要囿于固有的知识体系而停步不前,这就是学习std::string类的最朴素的思想。
1、字符串合并
C语言中,要进行字符串合并,那可费老劲了,不光要用strlen计算被合并字符串的长度,还要分配相应的内存,总之,谁用谁知道,我们看看C++的string类进行字符串合并有多么简单,在这里需要多啰嗦几句,在C++中,虽然string也是一个类,但我们可以就将它认为是基本的数据类型,且由于C++这么多年的发展,大家都形成了一种共识,就是将string看作C++的基本数据类型,这样,不管对于什么样的程序员,使用起来极其方便。
string a { "12" };
string b{ "34" };
string c{ a + b };
println("a + b = {}", c);
结果如下:
a + b = 1234
是不是too easy。
2、字符串比较
在C语言中,strcmp()使用起来是什么样大家应该心知肚明吧,并且有经验的C程序员基本不用strcmp(),一般都会用strncmp(),即便是strncmp(),其使用经验与技巧也会让初学者望而生畏。那就让我们来看看C++是怎么进行字符串比较的吧。
string a{ "Hello" };
string b{ "world" };
println("'{}' < '{}' = {}", a, b, a < b);
println("'{}' > '{}' = {}", a, b, a > b);
看一下运行结果:
'Hello' < 'world' = true
'Hello' > 'world' = false
是不是可读性更强,更容易理解。
但是,总是有杠精会提出问题,C++中有没有类似于strcmp()之类的直接进行字符串比较的函数,你还别说,还真有,当然了,是类似啊,是类的方法,因为在C++中已经没有像C中那样使用的函数了,这个要从理念上进行克服。各位看官,请看:
string a{ "12" };
string b{ "34" };
auto result{ a.compare(b) };
if (result < 0) { println("less"); }
if (result > 0) { println("greater"); }
if (result == 0) { println("equal"); }
结果:
less
不用多做解释了吧,compare功能与strcmp()完全一样,且更易读易理解。
当然了,这里面还是有一个需要注意的坑的,这个坑就是a.compare(b)的返回值不是逻辑值,而是与C中的strcmp()一样的数字,当两个字符串相等时,其返回值为0,对于没有C语言编程经验的小伙伴而言,这可能有点不好理解且容易犯错,很容易写出如下的代码:
if (a.compare(b)) { println("equal"); }
代码本身并没有任何语法错误,但结果却正好相反,这个上面已经解释的很清楚了,只是这里对于那些没有C语言编程经验的同学特别指出一下。
这里面可能又有杠精出现,说我就要看到类似的代码,能实现功能又易理解还不是反的,怎么办?谁让我这么好心呢,好事做到底,送佛上西天,列位,请看大屏幕:
string a{ "12" };
string b{ "34" };
auto result{ a<=>b };
if (is_lt(result)) { println("less"); }
if (is_gt(result)) { println("greater"); }
if (is_eq(result)) { println("equal"); }
结果与一开始一样:
less
能理解a<=>b的小伙伴会说,哦,明白了,确实上西天了;而不能理解a<=>b的小伙伴可能原来还挺明白的,现在反而被弄懵逼了。本来我想说,不懂就问,上baidu上去google一下就全明白了,又绕回来了,如果我去搜索的话,我花那么大的时间与精力看你的博客干嘛啊。好好,我错了,下面简单解释一下a<=>b的语法:
即"三向比较运算符(three-way comparison operator)",由于其外观,也被称为"宇宙飞船运算符(spaceship operator)",其符号为 <=> 。目的是简化比较对象的过程。这个运算符允许用户定义的对象之间进行全序比较,返回一个表示比较结果的枚举值,这个枚举值可以被用来决定两个对象是否相等、小于或大于另一个对象。更具体的信息,请参阅:https ://blog.csdn.net/fengbingchun/article/details/140078283
3、内存处理
string是不需要考虑分配与释放内存的,当字符串扩容时,系统会自动进行内存处理,不需要程序员去操心这些,这样,大家就可以轻松自如地去操作字符串了,好,我们看一个例子,加深一下印象,然后简单做一下解释:
string myString{ "hello" };
myString += ", wangjunshan";
string myOtherString{ myString };
if (myString == myOtherString) {
myOtherString[0] = 'H';
}
println("{}", myString);
println("{}", myOtherString);
可以用+=简单地对字符串进行扩容,可以用==简单地对字符串进行比较,可以像C语言中对字符数组中的字符进行操作,是不是很安逸。
需要指出的是:
1、不管如何操作string,都不会出现内存渗漏的问题。原理在此不做解释
2、用简单的操作符就可以对string进行你所想要的任何操作,如赋值、连接、比较、修改。随着你对string的越加熟悉,你会越来越喜欢它。