在一组字符串中查找一个特定的字符

这里我们介绍两种方法。

  • 第一种
#define TRUE 1
#define FALSE 0

int find_char(char **strings,char value){
    char *string;
    while((string = *strings++) != NULL){
        while(*string != '\0'){
            if(*string++ == value)
                return TRUE;
        }
    }
    return FALSE;
}
  • 第二种
下列这种方式实现与方案一同样的功能,但它不需要对指向每个字符串的的指针做一份拷贝。但是,由于存在副作用,这个程序将破坏这个指针数组。这个副作用使该函数不如前面那个版本有用,因为它只适用于字符串只需要查找一次的情况。
#define TRUE 1
#define FALSE 0

int find_char(char **strings,int value){
    assert(strings != NULL);
    while(*strings != NULL){
        while(**strings != '\0'){
            if(*(*strings)++ == value)
                return TRUE;
        }
        strings++;
    }
    return FALSE;
}

这个程序中存在两个有趣的表达式:

第一个是**strings。第一个间接访问操作访问指针数组中的当前指针,第二个间接访问操作随该指针访问字符串中的当前字符。内层的while语句测试这个字符的值并观察是否到达了字符串的末尾。

第二个有趣的表达式是*(*strings)++。这里的括号是需要的,这样才能使表达式以正确的顺序进行求值。第一个间接访问操作访问列表中的当前指针。增值操作把该指针所指向的那个位置的值+1,但第二个间接访问操作作用于原先那个值的拷贝上。这个表达式的直接作用是对当前字符串中的当前字符进行测试,看看是否到达了字符串的末尾。作为副作用,指向当前字符串字符的指针值将增加1。







猜你喜欢

转载自blog.csdn.net/cecilia3333/article/details/80474223