❶ c語言 怎麼寫 可變 參數函數
#include<stdarg.h>//可變參數函數必要的頭文件
#include<stdio.h>
longintsum(unsignedintargc,...)//可變參數函數必須包含至少一個確定的參數
{
longintsrt=0;
intva;
unsignedinti;
va_listvl;//用於指向可變參數列表
va_start(vl,argc);//初始化,va_start()調用的第一個參數是所編寫的可變參數函數的最後一個確定的參數
for(i=0;i<argc;i++){
srt+=(int)va_arg(vl,int);//從參數列表按提取一個int類型的值參與相加運算
}
va_end(vl);//清理
returnsrt;
}
intmain(intargc,char*argv[])
{
printf("%ld ",sum(3,1,2,3));
return0;
}
❷ C語言中如何實現可變參函數
C語言中可變參函數實現,主要通過VA_LIST宏及相關操作的幾個宏。
一、涉及宏及說明:
所有相關宏均定義在stdarg.h中。
1、va_list: 可變參數列表指針。
2、va_start:獲取可變參數列表的第一個參數的地址。
3、va_arg:獲取可變參數的當前參數,返回指定類型並將指針指向下一參數。
4、va_end:清空va_list可變參數列表。
可變參函數的實現,就是這四個宏的使用。
二、代碼舉例:
在實際應用中,經常有獲取若干個數最大值的情況,當數量比較大的時候,一般通過數組實現,但個數不多時,一般寫一個max函數。 常規寫法都是用到幾個數的max,就寫幾個參數, 對此可以實現一個可變參數函數,第一個參數指定共計有多少數據,後續各個參數為要比較的值。
#include<stdio.h>
#include<stdarg.h>
intmax(intn,...)//可變參數函數。
{
intr,i;
va_listap;//定義可變參數。
if(n==0)return-1;//異常參數。
va_start(ap,n);//得到起始點。
for(i=0;i<n;i++)
{
intv=va_arg(ap,int);//獲取下一個參數值。
if(i==0)r=v;
elseif(r<v)r=v;
}
va_end(ap);//結束可變參數。
returnr;//返回結果。
}
可以用如下主函數測試:
intmain()
{
printf("%d ",max(1,1));
printf("%d ",max(2,2,1));
printf("%d ",max(3,5,9,4));
printf("%d ",max(4,8,3,1,9));
return0;
}
分別測試了1,2,3,4個數值,求取最大值的情況。
測試結果:
1
2
9
9
❸ 如何在C語言中實現可變長度的參數
C語言實現可變長度字元串,主要依靠realloc函數實現,主要代碼如下,
//程序功能,判斷插入字元長度len,若大於預設大小n,調整字元串數組大小,實現動態處理數組大小。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char * pstr = NULL;
int n=10;//字元串初始大小
char str[100];//待插入字元串
int len=0;//待插入字元串長度
pstr = (char*)malloc(sizeof(char)*n);//申請sizeof(char)*n個大小的內存空間
if (pstr==NULL)
{
printf("內存申請出錯,程序退出!\n");
exit(1);
}
❹ C語言中如何獲取函數可變參數的個數
這個看你是怎麼調用的
一般都是約定個數 或者根據第一個參數,決定個數。
你這個寫法,看起來是兩個參數調用,然後都是char* 如果是這樣
要改成
#include<stdio.h>
#include<stdarg.h>
voidprint(char*value,...)
{
char*t;
printf(value);
va_listval;
va_start(val,value);
t=va_arg(val,char*);//獲取下一個參數需要賦值的。
printf(t);
va_end(val);
}
❺ c語言中什麼是可變參數最好有簡單的應用可變參數的例子。謝謝
一個簡單的可變參數的函數的例子:
#include <stdio.h>
#include <stdarg.h>
void Func(int count, ...) //可變形參的函數的定義
{
va_list ap;
int n = count; //使用count來表示後面的參數個數
char *s = NULL;
int d = 0;
double f = 0.0;
va_start(ap, count); // 從第二個形參開始讀取
s = va_arg(ap, char*); //為形參指定類型char*
d = va_arg(ap, int); //為形參指定類型int
f = va_arg(ap, double); //為形參指定類型double
va_end(ap); //讀取形參結束
printf( "%s %d %f ", s, d, f); //這里可以做想要的功能了。
}
main()
{
Func(3, "Hello", 345, 788.234);
}
❻ C語言 可變參數列表
雖然我對可變參數表不太懂,但是我可以看得出你的/* */那段顯然有問題,你for循環4遍,但你獲取可變參數值的時候你沒有告訴獲取第幾個值,那個count肯定不僅僅是個循環變數,它在循環體中肯定還要用來提示獲取第幾個參數,也就是你注意一下if里的m=va_arg(var_arg,float)這個語句,肯定要用到float
❼ c語言如何定義一個可變參數函數 如何調用其輸入的參數 分別
有專門的宏,處理可變參
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
一個簡單的例子
voidsimple_va_fun(inti,...)
{
va_listarg_ptr;
intj=0;
va_start(arg_ptr,i);
j=va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("i=%dj=%dn",i,j);
return;
}
intmain()
{
simple_va_fun(1);
simple_va_fun(1,2);
simple_va_fun(1,200);
return0;
}
❽ c語言中函數可否改變參數值
#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
&x);
printf("y
=
%d
at
[%x]n",
y,
&y);
printf("z
=
%d
at
[%x]n",
z,
&z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
運行結果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual
c++.即然兩種方式都可以,為什麼c語言要選擇從右至左呢?
進一步發現,pascal語言不支持可變長參數,而c語言支持這種特色,正是這個原因使得c語言函數參數入棧順序為從右至左。具體原因為:c方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。
因此,c語言函數參數採用自右向左的入棧順序,主要原因是為了支持可變長參數形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,採用自左向右的參數入棧方式
❾ C語言可變參數傳遞的問題
voidfun1(inta,intb,constchar*fmt,...);
voidfun2(constchar*fmt,...);.
你注意了,參數傳遞的可是const類型的,不可以改變哦~
傳遞出來的args當然也不會有變化。
(奇怪的是你的編譯器沒有報錯嗎?暈啊……)
❿ c語言如何封裝一個帶有可變參數的方法
需要借用C語言的VA_LIST宏定義,及相關操作來實現可變參數。
VA_LIST所在頭文件:#include <stdarg.h>,用法如下:
(1)首先在函數里定義一具VA_LIST型的變數,這個變數是指向參數的指針;
(2)然後用VA_START宏初始化剛定義的VA_LIST變數;
(3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);
(4)最後用VA_END宏結束可變參數的獲取。
以下是一個自定義列印介面的實現:
intmy_printf(constchar*fmt,...)//...表示參數可變
{
va_listargs;//定義va_list
staticchargc_PrintfOutBuff[1000];
va_start(args,fmt);//初始化
vsnprintf((char*)gc_PrintfOutBuff,1000,(char*)fmt,args);//這里沒有使用VA_ARG取回單個變數,而是借用vsnprinf一次性讀取。
va_end(args);//結束獲取
puts("%s",(constchar*)gc_PrintfOutBuff);//使用。
return0;
}