程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言不定參數與printf函數的實現

c語言不定參數與printf函數的實現

編輯:關於C語言

c語言不定參數與printf函數的實現


 今天學習了C語言不定參數,C語言中的不定參數主要靠<strarg.h>這個頭文件實現,這個頭文件包含了va_list()、va_start()、va_end()三個宏,其用法為先聲明一個va_list類型的變量,它用於訪問參數列表未確定的部分。這個變量是由va_start來初始化的。它的第一個參數是va_list的變量名,第二個參數是省略號前最後一個有名字的參數。初始化過程把va_list的變量設置為指向可變參數的第一個參數。     為了訪問參數,需要使用va_arg,這個宏接受兩個參數(va_list變量和參數列表中下一個參數的類型)訪問完最後一個參數,需要調用va_end(),其格式如下:  
void fun(int a,...)
{
va_list parameter;
va_start(parameter, a);
va_arg(parameter, int );
}

 

      舉個例子,如果要實現求多個數的平均值,因為C中不允許默認參數,所以只能用上述方法進行求平均數,代碼如下  
int average(int val, ...)
{
va_list arg;
int sum = 0;
int i = 0;
va_start(arg, val);
//va_arg();
for (i = 0; i < val; i++)
{
sum += va_arg(arg, int);//每調用一次向下取一個
}
va_end(arg);
return sum / val;
}

 

    如果要求多個數的最大值可以寫為  
int average(int val, ...)
{
va_list arg;
int max;
int sum = 0;
int i = 0;
va_start(arg, val);
for (i = 0; i < val; i++)
{
sum = va_arg(arg, int);
if (sum>max)
max = sum;
}
va_end(arg);
return max;
}

 

    由此我們還可以用stdarg這個宏來模擬printf函數的實現,這裡我只是做了模擬了字符串輸出,整形與字符型輸出代碼如下:  
#include<stdio.h>
#include<stdarg.h>
void printd(int n)//把整形按字符型輸出
{
if (n < 0)
{
putchar('-');
}
if (n)
{
printd(n /10);
putchar(n % 10 + '0');
}
}
void my_printf(char* val,...)
{
int ch;
va_list arg;
va_start(arg, val);
while (*val != '\0')
{
switch (*val)
{
case '%':            //遇到%執行switch case語句
{
if (*(val + 1) == 'c')//輸出字符
{
ch = va_arg(arg, char);
putchar(ch);
val++;                //指針變量向下偏移一個單位
}
else if (*(val + 1) == 'd')
{
ch = va_arg(arg, char);//輸出整形
printd(ch);
val++;
}
else if (*(val + 1) == 's')//輸出字符串
{
char*p = va_arg(arg, char*);
while (*p != '\0')
{
putchar(*p);
p++;
}
val++;                //指向頭一變量的下一個字符
}
else
putchar('%');
break;
}
default:
{
    putchar(*val);
break;
}
}
val++;
}
va_end(arg);
}
int main()            //程序調試
{
int c =100 ;
char*p = "laomasb";
char a = 'c';
my_printf("%s\n%d\n%c\n", p, c,a);
system("pause");
return 0;
}

 

      這裡寫得還差很多,比如說%後面加數字的話是沒辦法識別並且寇沖輸出空間的,而且這代碼自己看著就比較low。希望大神給出些建議。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved