C++自学血汗史(三):请注意C++与C的字符串不同问题

正式内容开始前提起一个菜鸟的面试经验:也就几天前的事,电话面试中问了我一个关于单链表是否存在环的问题,我回答了一个笨方法,即单向遍历边走边存储内存地址,当发现p指针的next地址在记录数组中存在过时,则存在环。

他就问我那数组的大小怎么确定呢?额,我当时想到了数组的长度大小是一次分配的,而他没说多少个数据,所以我决定用链式数组存储地址,于是后续他想让我优化算法的时候,查找部分就显得那么无力。

今天学习的过程中我才发现自己的一个大问题,就是很多地方我把C的样子自然地当作了C++的样子,就例如本次要说的内容,就是我面试中犯的一个致命错误。算了,菜鸟不可怕,不学才可怕。

在C语言中,并没有字符串这个数据类型,有的是字符类型(char),因此C是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾的字符数组才是C字符串,否则只是一般的C字符数组。出于以上原因,我们在C语言字符的学习过程中,对这个'\0'问题小心翼翼,常常为了那么一个1而缓缓思考。

在C++中,字符串被封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作。这就有意思了,我们可以像int,double等内置类型的方式直接定义字符串,而不需要字符数组,因此也自然而然不需要'\0'这个结束标志了。

这里有一个简单的对比表格,可以仔细读一下:

在C中,常用的字符串操作函数汇总如下(千万记得,C中不能把占内存多的字符串赋值给比它小的,会溢出):

/*
1.strcpy 
功 能: 将参数src字符串拷贝至参数dest所指的地址 
用 法: char *strcpy(char *dest, const char *src);
2.strncpy
功  能: 将字符串src前n个字符拷贝到字符串dest
用  法: char *strncpy(char *dest, const char *src, size_t n);
3.strcat
功  能: 字符串拼接函数,strcat() 会将参数src字符串复制到参数dest所指的字符串尾部
用  法: char *strcat(char *dest, const char *src);
4.strncat
功  能: 将n个字符追加到字符串的结尾
用  法: char *strncat(char *dest, const char *src, size_t n);
5.strchr
功  能: 在一个字符串中查找给定字符的第一个匹配之处
用  法: char *strchr(const char *str, int c);
6.strcmp
功  能: 字符串比较
用  法: int strcmp(const char *s1, const char *s2);
7.strlen
功  能: 计算指定的字符串s的长度,不包括结束字符'\0'
用  法: size_t strlen(const char *s);
8.strspn
功  能: 用来计算字符串str中连续有几个字符都属于字符串 accept
用  法: size_t strspn(const char *str, const char * accept);
9.strerror
功  能: 返回指向错误信息字符串的指针
用  法: char *strerror(int errnum);
10.strtok
功  能: 根据分界符将字符串分割成一个个片段
用  法: char *strtok(char *s, const char *delim);
11.strstr
功  能: 检索子串在字符串中首次出现的位置
用  法: char *strstr( char *str, char * substr );
12.strpbrk
功  能: 返回两个字符串中首个相同字符的位置
用  法: char *strpbrk(char *s1, char *s2);
13.atoi
功  能: 将字符串转换成整数(int)
用  法: int atoi (const char * str);
*/

在C++中,常用的字符串操作函数汇总如下:

还是别汇总了,那么老多,你用啥去找啥吧。。。比较、拼接和排序等等等等各种操作,只有你想不到没有C++做不到......

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值