周立功《程序设计与数据结构》:字符串函数
是字母。与其说该函数按字母顺序进行比较,还不如说是按机器排序序列进行比较,即根据字符的数值(ASCII值)进行比较,在ASCII中,大写字母在小写字母前面,因此strcmp("Z", "a")返回的是负值。
在大多数情况下,strcmp()返回的具体值并不重要,只在意该值是0还是非0,即比较两个值是否相等,或按字母排序字符串,此时需要知道比较的结果是正、负或0。假设word是存储在char类型数组中的字符串,ch是char类型的变量。即:
if(strcmp(word, "hello") == 0) puts("bye")
if(ch == 'q' ) puts("bye")
尽管如此,不要使用ch或'q'作为strcmp()的参数。
strcmp()比较两个字符串中的字符,直到发现不同的字符为止,这一过程可能会持续到字符串的末尾。而strcmp()在比较两个字符串时,可以比较字符不同的地方,也可以只比较第3个参数指定的字符数。其函数原型如下:
int strncmp(char const *s1, char const *s2, size_t n);
strcpy()函数
strcpy()函数有两个属性,第一,strcpy()的返回值类型为char *,该函数返回的是第1个参数的值,即一个字符的地址。第二,第1个参数不必指向数组的开始,这个属性可用于拷贝数组的一部分。注意,strcpy()将源字符串中的空字符也拷贝在内。
如果pts1和pts2都是指向字符串的指针,那么下面语句拷贝的是字符串的地址,而不是字符串本身。即:
pts2 = pts1;
如果希望拷贝整个字符串,可以使用strcpy()函数。其函数原型如下:
char *strcpy(char *s1, char const *s2);
// 前置条件:s2是一个以null结尾的字符串,s1数组有足够的空间容纳s2的一个副本
// 后置条件:s2被复制到s1,且返回值是一个指针,该指针指向s1数组的第一个字符
该函数将s2指向的字符串(包括空字符)拷贝至s1指向的位置,返回s1。即strcpy()接受2个字符串指针作为参数,可以将指向源字符串的第2个指针声明为指针、数组名或字符串常量,而指向源字符串副本的第1个指针应指向一个数据对象,比如,数组,且对象要有足够的空间存储字符串的副本,通常将拷贝出来的字符串称为目标字符串。注意,声明数组将分配存储数据的空间,而声明指针只分配存储一个地址的空间。
strncpy()函数
strcpy()和strcat()都有同样的问题,它们不能检查目标空间是否能容纳源字符串的副本,因此拷贝字符串使用strncpy()更安全,该函数的第3个参数指明可拷贝的最大字符数。其函数原型如下:
char *strncpy(char *s1, char const *s2, size_t n);
该函数将s2指向的字符串拷贝至s1指向的位置,拷贝的字符不超过n,其返回值为s1。该函数不会拷贝空字符后面的字符,如果源字符串中的字符数少于n,则目标字符串就以拷贝的空字符结尾。如果源字符串有n个或超过n个字符,就不拷贝空字符,所以拷贝的副本中不一定有空字符。基于此,一般会将n设置比目标数组大小少1,然后将数组最后一个元素设置为空字符。
这样做的目的将确保存储的是一个字符串,如果目标空间能够容纳源字符串的副本,那么从源字符串拷贝的空字符便是该副本的结尾;如果目标空间装不下副本,则将副本最后一个元素设置为空字符。
尽管C语言允许将字符串作为一个字符数组或一个指向字符的指针,但是从更抽象的角度理解字符串将会更有意义。如果你想访问字符串中的单个字符,则需要注意它的表现形式。如果将字符串当作一个整体来看待的话,那么就可以忽略其表现的细节,而写出更容易理解的程序。比如:
typedef char *striing;
其目的是强调字符串是一个在概念上完全不同的类型,虽然string与char *类型完全相同,但它们传递的信息却是不同的。如果将一个变量定义为char *类型,其底层的表示方法是指针;如果将一个变量定义为string类型,就会将该字符串作为整体看待。这样一来,在声明函数的形参时,无论是将字符串作为数组、指针或抽象数据类型,它们都是可以互换的,其声明方法
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)
