c語言變參函數
❶ sprintf()函數的用法
sprintf 是個變參函數,定義如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前兩個參數類型固定外,後面可以接任意多個參數。而它的精華,顯然就在第二個參數:格式化字元串上。
printf 和sprintf 都使用格式化字元串來指定串的格式,在格式串內部使用一些以「%」開頭的格式說明符(format specifications)來占據一個位置,在後邊的變參列表中提供相應的變數,最終
函數就會用相應位置的變數來替代那個說明符,產生一個調用者想要的字元串。
sprintf的第一個參數是目的字元串
sprintf指的是字元串格式化命令,函數聲明為 int sprintf(char *string, char *format [,argument,...]);,主要功能是把格式化的數據寫入某個字元串中,即發送格式化輸出到 string 所指向的字元串。
使用sprintf 對於寫入buffer的字元數是沒有限制的,這就存在了buffer溢出的可能性。解決這個問題,可以考慮使用snprintf函數,該函數可對寫入字元數做出限制。
❷ c語言可變參數是干什麼的
可變參數是用於調用函數時,不知道參數的個數及類型的一種場合,最經典最常用的是
int
printf(const
char
*format[,
argument,
...]);
它後面的參數類型及數量都是可變的
如
printf("%d",x);
//一個int參數
printf("%d%d%s\n",x,y,z);
//三個參數,前兩個為int,後面的為char
*
❸ 急!!!高手請進, 請教c語言的可變參數函數, 如何求字元串長度
要求出傳入參數的總長度容易,代碼附下(只做了%s%d%c的支持,其他可以自己做)。
但你申請了buf後,還要把這些變數拷到str中,需要考慮統計的時候把每個變數的長度和指針保存下來,申請buf空間後,直接即可,省得再取一次變數。這一塊沒有替你考慮。
while (*fmt) {
if (*fmt++ != '%') {
nsize++;
continue;
}
switch (*fmt++) {
case 'd':
i = va_arg(marker, int);
do {
nsize++;
} while (i/=10);
break;
case 'c':
c = (char)va_arg(marker, int);
nsize++;
break;
case 's':
s = va_arg(marker, char *);
nsize += strlen(s);
break;
default:
printf("in default\n");
break;
}
}
❹ C語言變參函數Printf實現機制是什麼
像printf()/scanf()這樣參數數量可變的函數稱為variadic函數,請自行在網上查找相關資料吧.
❺ c語言中什麼是可變參數最好有簡單的應用可變參數的例子。謝謝
一般在傳遞實參的時候,可以是常量類型、或者地址指針的方式,如果以地址的方式傳參的話,參數的數量就是可以任意變的,而數組也是地址,比如你在傳一個數組的時候,就需要另一個整形參數來記錄這次數組中含有幾個有效參數。
❻ C語言可變參數傳遞的問題
方案是有的,但是需要用到匯編代碼。而且,不同的CPU架構,代碼寫起來還不一樣。
大概的方法,通過解析fmt的內容,找出其中的%d、%u等格式控制符,根據格式控制符,提取出後面的各個參數。參數如何提取,需要用到匯編代碼,而且不同的CPU架構,代碼實現是有差異的。
不過,在下覺得,您可能並不需要真正實現這樣的函數。或許將fun1定義為類似如下的一個宏,就能解決你的問題了吧。
#define fun1(a,b,fmt, args...) \
do \
{ \
if (a>b) \
{ \
fun2(fmt, ##args); \
} \
else \
{ \
fun2(fmt, ##args); \
} \
} while (0)