C++学习笔记----Strings与String View(3)--字符串的简单操作

        终于到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的越加熟悉,你会越来越喜欢它。

  • 34
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王俊山IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值