周立功《程序设计与数据结构》:字符串函数
本文为程序设计基础,本文为1.8.2 字符串常量第三点:字符串函数。
>>>>
1. 字符串函数
标准C提供了一个操作字符串的接口string.h,其中的很多函数是有特殊用途的,下面将详细介绍通过string.h导出的最重要的函数原型。
strlen()函数
strlen()函数用于统计字符串的长度,其函数原型如下:
size_t strlen(const char *s);
// 前置条件:s是一个以null结尾的字符串
// 后置条件:返回值为s中的字符个数(不包括null字符)
下面的函数可以缩短字符串的长度,其中用到了strlen()。即:
1 void fit(char *string, unsigned int size)
2 {
3 if(strlen(string) > size)
4 strlen[size] = '\0';
5 }
由于该函数要改变字符串,因此函数在声明形参string时没有使用const限定符。当然,也可以调用strlen(s)确定字符串s的长度,或用if语句比较两个字符串是否相等。即:
if(strcmp(s1, s2) == 0) …
strcat()函数
用于拼接字符串的strcat()函数接受两个字符串作为参数,其函数原型如下:
char *strcat(char *s1, char const *s2);
// 前置条件:s2是一个以null结尾的字符串,s1数组的末尾还有足够的空间容纳s2的一个副本
// 后置条件:s2被连接到s1中,且返回值是一个指针,该指针指向s1数组的第一个字符
该函数将第2个字符串的备份附加在第1个字符串末尾,s2字符串的第1个字符将覆盖s1字符串末尾的空字符,并将拼接后的新字符串作为第1个字符串返回,第2个字符串不变。strcat()函数的类型是char *(即指向char的指针),strcat()函数返回第1个参数,即拼接第2个字符串后的第1个字符串的地址。
由于strcat()函数无法检查第1个数组是否能够容纳第2个字符串,如果分配给第1个数组的空间不够大,那么多出来的字符溢出到相邻存储单元时就会出问题,当然也可以用strlen()查看第1个数组的长度。注意,要给拼接后的字符串长度加1才够空间存放末尾的空字符。或者用strncat(),该函数的第3个参数指定了添加的最大字符数,其函数原型如下:
char *strncat(char *s1, char const *s2, size_t n);
该函数将s2字符串中的n个字符拷贝到s1字符串末尾,s2字符串中的第1个字符将覆盖s1字符串末尾的空字符。不会拷贝s2字符串中的空字符和其后的字符,并在拷贝字符的末尾添加一个空字符,该函数返回s1。
strcmp()函数和strncmp()函数
strcmp()函数要比较的是字符串的内容,不是字符串的地址,其函数原型如下:
int strcmp(char const *s1, char const *s2);
// 前置条件:s1和s2都是以null结尾的字符串
// 后置条件:返回值为0,表示s1=s2;
// 返回值小于0,表示s1在词典顺序上位于s2之前;
// 返回值大于0,表示s1在词典顺序上位于s2之后
如果s1字符串在机器排序序列中位于s2字符串的后面,该函数返回一个正数;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2字符串的前面,则返回一个负数。strcmp()函数比较的是字符串("hello")不是字符('q'),所以其参数应该是字符串。由于char的类型实际上是整数类型,因此可以使用关系运算符比较字符。如果两个字符串开始的几个字符都相同会怎样?strcmp()会依次比较每个字符,直到发现第1对不同的字符为止,然后返回相应的值。比如,"apples"和"apple"只有最后一对字符不一样("apples"的s和"apple"的空字符),由于空字符在ASCII中排第1,字符s一定在它后面,所以strcmp()返回一个正数。
最后一个例子,strcmp()比较所有的字符,不只
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)