在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 可變參數(shù)
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹(shù)的保存和加載
圖添加和刪除
排序二叉樹(shù)線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹(shù)深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹(shù)
大數(shù)計(jì)算
二叉樹(shù)廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹(shù) 下
線性堆棧
八皇后
排序二叉樹(shù)刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹(shù) 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹(shù)
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹(shù)插入
圖的保存
排序二叉樹(shù)刪除-2
排序二叉樹(shù)刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

可變參數(shù)

可變參數(shù)是C語(yǔ)言編程的一個(gè)特色。在我們一般編程中,函數(shù)的參數(shù)個(gè)數(shù)都是確定的,事先定下來(lái)的。然而就有那么一部分函數(shù),它的個(gè)數(shù)是不確定的,長(zhǎng)度也不一定,這中間有什么秘密嗎?

其實(shí),我們可以回憶一下哪些函數(shù)是可變參數(shù)的函數(shù)?其實(shí)也就是sprintf、printf這樣的函數(shù)而已。那么這些函數(shù)有什么規(guī)律嗎?關(guān)鍵就是在這個(gè)字符串上面。我們可以舉一個(gè)例子看看,

void test()  
{  
    printf("%s, value = %d\n", "hello", 10);  
}  

test函數(shù)里面也就是一個(gè)簡(jiǎn)單的打印函數(shù)。那么這個(gè)函數(shù)有什么特別的地方呢,那就是%s、%d和后面的字符是一一對(duì)應(yīng)的,所以有多少個(gè)這樣的字符,首參數(shù)后面就會(huì)剩下多少個(gè)參數(shù)。那么后面參數(shù)的地址怎么獲取呢?我們可以回想一下,堆棧一般是怎么壓棧處理的,

/* 
* stack space: 
* 
*        參數(shù)3   |    up 
*        參數(shù)2   | 
*        參數(shù)1   v    down 
*/  

因?yàn)閰?shù)是按照從右向左依次壓入的,所以后面參數(shù)的地址依次根據(jù)“%”處理即可。下面我們就可以自己寫一個(gè)PrintInt打印int數(shù)據(jù)的函數(shù),首先創(chuàng)建一個(gè)框架,

void PrintInt(char* buffer, int data, ...)  
{  
    return;  
}  

然后驗(yàn)證buffer參數(shù)中是否有%d,如果存在這樣的一個(gè)字符,就需要打印一個(gè)整數(shù),

void PrintInt(char* buffer, int data, ...)  
{  
    static char space[1024];  
    char temp[32];  
    int* start;  
    int count;  

    if(NULL == buffer)  
        return;  

    memset(space, 0, 1024);  
    memset(temp, 0, 32);  
    start = (int*) &buffer;  
    count = 0;  

    while(buffer[count]){  
        if(!strncmp(&buffer[count], "%d", strlen("%d"))){  
            start ++;  
            itoa(*start, temp, 10);  
            strcat(space, temp);  
            count += 2;  
            continue;  
        }  

        space[strlen(space)] = buffer[count];  
        count ++;  
    }  

    memset(buffer, 0, strlen(buffer));  
    memmove(buffer, space, strlen(space));  
    return;  
}  

為了驗(yàn)證我們的函數(shù)是否正確,可以編寫測(cè)試函數(shù)驗(yàn)證一下,

void display()  
{  
    char buffer[32] = {"%d %d %d %d\n"};  
    PrintInt(buffer, 1, 2, 3, 4);  
    printf(buffer);  
}