c和c++:字符串函数库的“诡异现象” openjudge#37978026

废话少说,直接给题目

题目
咳咳,最近学的有点杂,c和c++一起混着来,在写字符串的一些题目,回到题目,看着简简单单,但仔细推敲,知识点还是很多的。

知识点引入
首先分享我第一次的代码
在这里插入图片描述
看到这里我就疑惑了哈,报的错说:‘strlen’ was not declared in this scope. 咦,我不是调用了<string>的函数库吗?

浅谈c++函数头文件’string’与’cstring’

在看到这两个头文件我都傻了,咋?c++字符串操作函数还整两个函数头文件存储?

1. cstring:

在我们入门c语言时,肯定了解过c语言中<string.h>这个函数库,而我们c++中的<cstring>,实际上与<string.h>“师出同门”,这两个里面都是c标准库中的东西,你可以将理解为<string.h>成年版本,但注意哦,是c++,不能在c program里面用哦,简单来说:头文件<cstring>兼容了<string.h>里面的东西,但是采用了c++的写法

2.string:

相对于以上两者,string 里面的是c++标准库里的东西,他和cstring都位于std空间内。(我的理解是string头文件就充当正统的位置,但是为了照顾以前c的版本,所以又整出来一个cstring来兼容)有些东西就很诡异你懂吧,就像gets和puts函数,实际上string和cstring里面都有,咱就是说,如果你不确定,你直接把cstring和string都写上去,简单粗暴!

其实我有点困扰,为啥不把cstring里的东西放在string里面,或许是为了调用对应函数库时更有针对性?节省空间?我不太懂,有大佬可以告诉我一下不
so 经过上面的科普,很容易发现代码的错误之处,strlen在c语言中位于string.h头文件中,所以我们需要调用cstring头文件,达到使用strlen的目的

额~其实单单从统计字符串长度来说,大抵也不用这么麻烦 看代码。。。

//统计字符串数组长度(不包括'\0')
//假设已经有了一个字符数组arr[]
int len=0,i;
while(arr[i]!=0){
	i++;
	len++;
}

到这里,其实这个题目就差不多了,但还有一点小细节,就是题目中强调了变换后的字符串只有一行,但是我们使用了puts函数的时候是默认换行的(自动将字符数组末尾的’\0’转换为’\n’),所以交上去不会ac,咋办嘞?

cout<<b<<endl;

你自己运行一下,发现最后还是又一个换行(原因应该与puts函数是一样的)

那咋办嘞,难死我了呜呜呜呜呜 别慌!好办,大道至简,用printf函数

for(int i=0;i<n;i++){
		printf("%c",b[i]);
	} 

可是这里又有问题了,为啥c++的标准输出流又可以用printf来输出。我真TM**** 难道还像cstring和string那样?我觉得这要从c和c++的关系和起源讲起,简单的一个兼容不是我想要的答案。

他们的函数库之间有什么关系,运行的编译器又有什么关系,类似的函数名真正运行起来又有怎样细微的区别?这些才是我真正想了解的,而不是一两个函数(用了一次下一次必忘),更不是这种2分钟ac的题目。(我打算接下来在提到c++的一些输入输出函数中提到这些内容,今天实在干不动了)

享受这种由实际问题一层层抽丝剥茧探寻知识本源的过程,这远比知识本身更重要,并且有趣的多!

内心os:我特喵还能讲出这话?不可思议不可思议哈哈,明天见,掰掰。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值