C語言特殊函數的應用

1. va_list相關函數的學習:html

va_list是一種變參量的指針類型定義.ios

va_list使用方法以下:編程

1)首先在函數中定義一個具備va_list型的變量,這個變量是指向參數的指針。函數

2)首先在函數中定義一個具備va_list型的變量,這個變量是指向參數的指針。學習

3)而後va_arg返回可變參數,va_arg的第二個參數是你要返回的參數的類型(若是多個可變參數,依次調用va_arg獲取各個參數)。spa

4)最後使用va_end宏結束可變參數的獲取。指針

在使用va_list是應該注意一下問題:code

1)  可變參數的類型和個數徹底由代碼控制,它並不能智能地識別不一樣參數的個數和類型。htm

2)  若是咱們不須要一一詳解每一個參數,只須要將可變列表拷貝到某個緩衝區,能夠用vsprintf函數。blog

3)  由於編譯器對可變參數的函數原型檢查不夠嚴格,對編程查錯不利,不利於咱們寫出高質量的代碼。
Coding:
#include "stdarg.h"
#include <iostream>
#include <stdio.h>

static char buf[512];
int sum(char* msg, ...);

int main(void)
{
    int total = 0;
    char str[] = "%dhello%dworld!%d";
    total = sum(str, 1, 2, 3);
    std::cout << "total = " << total << std::endl;
    return 0;
}

int sum(char* msg, ...)
{
    va_list vaList; //定義一個具備va_list型的變量,這個變量是指向參數的指針。
    va_start(vaList, msg);//第一個參數指向可變列表的地址,地址自動增長,第二個參數位固定值
    std::cout << msg << std::endl;
    int sumNum = 0;
    int step,i;

    vsnprintf(buf,sizeof(buf),msg,vaList);

    for(i=0;i<30;i++){
        printf("%c",buf[i]);
    }
    while ( 0 != (step = va_arg(vaList, int))) //va_arg第一個參數是可變參數的地址,第二個參數是傳入參數的類型,返回值就是va_list中接着的地址值,類型和$
    {                          //va_arg 取得下一個指針
        //不等於0表示,va_list中還有參數可取
        sumNum += step;
    }
    va_end(vaList);//結束可變參數列表
    return sumNum;
}

Reference:

a. http://www.javashuo.com/article/p-pozdqchd-cg.html

相關文章
相關標籤/搜索