微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 周立功手把手教你学C语言编程:用数组,构造一个双重指针

周立功手把手教你学C语言编程:用数组,构造一个双重指针

时间:08-04 来源:ZLG致远电子 点击:

程序清单 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,虽然它们都是等价的,但前一种形式能将参数的使用方式表达得更清楚。

 

这里采用的搜索算法称为顺序搜索,它逐个查看每个数据是不是要找的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top