周立功手把手教你学C语言编程:用数组,构造一个双重指针
程序清单 1.47是针对程序清单 1.45的另一种解决方案。其首先判断*pKeyWord所指向的是否为空字符串(即只包含'\0'的字符串,也就是字符串第0个元素为'\0'的字符串),如果为空字符串,则退出循环;如果不是,则输出显示该字符串,然后将pKeyWord加1指向下一个字符串。
程序清单 1.47 用指针数组变量与双重指针变量处理多个字符串(2)
1 #include
2 int main(void)
3 {
4 char **pKeyWord;
5 static char * keyWord[6] = {"eagle", "cat", "and", "dog", "ball", "NULL"};
6
7 pKeyWord = keyWord;
8 while(**pKeyWord != ""[0]) // ""[0]等价于'\0'
9 printf("%s\n", *(pKeyWord++));
10 return 0;
11 }
在实际的应用中,程序清单 1.47(9)中的"""[0]"是一种非常少见的用法。如果用'\0'代替它则功能一样,执行效率还稍微高一点。由于字符串常量是只读字符数组,因此字符串常量""""就是只有字符串结束字符'\0'的字符串常量,即数组变量的第0个元素的值为'\0'。由于""""是一个数组变量,因此可以使用下标运算符对""""进行求值运算,获得指定的数组元素,从而得到"""[0]"的值'\0'。一般来说,在大多数程序中都直接使用'\0'不使用""[0],而程序清单 1.47(8)之所以使用"""[0]"有两重意义:
● 与程序清单 1.47(5)对应,使程序的含义更清晰。当*pKeyWord指向最后一个字符串的第0个元素时,则结束循环;注意:这个字符串的第0个元素与其他任何一个字符串的第0个元素都不相同。
● 可移植性更好。如果将来C语言的字符修改了结束字符的定义,则程序也不必修改。比如,为了支持中文,将一个中文字作为一个字符,则字符类型必须修正,因为它不再是8位,所以其结束字符也可能修改。
如果要存储静态的表格式数据,当然应该用数组。搜索程序必须知道数组中有多少个元素,对这个问题的处理方法是传递一个数组长度参数。这里采用的另一种方法是选择指针数组方式。即:
const char * keyWord[6] = {"eagle", "cat", "and", "dog", "ball", NULL};
即在表尾增加了一个NULL指针,这个NULL指针使函数在搜索这个表时能够检测到表的结束,而无需预先知道表的长度,其相应的搜索范例程序详见程序清单 1.48。
程序清单 1.48 搜索范例程序
1 int lookup(char *word, char *keyword[])
2 {
3
4 for(int i = 0; keyiWord[i] != NULL; i++)
5 if(strcmp(word, keyWord[i] == 0))
6 return i;
7 return -1;
8 }
在C语言中,字符串数组参数可以是char *keyiWord[]或char **keyWord,虽然它们都是等价的,但前一种形式能将参数的使用方式表达得更清楚。
这里采用的搜索算法称为顺序搜索,它逐个查看每个数据是不是要找的
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)