正式内容开始前提起一个菜鸟的面试经验:也就几天前的事,电话面试中问了我一个关于单链表是否存在环的问题,我回答了一个笨方法,即单向遍历边走边存储内存地址,当发现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++做不到......