1. 程式人生 > >在一組字串中查詢一個特定的字元

在一組字串中查詢一個特定的字元

這裡我們介紹兩種方法。

  • 第一種
#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。