c語言可變參數(shù)實(shí)現(xiàn)示例
這段代碼展示了如何不使用<stdarg.h>中的va_list、va_start、va_end宏來實(shí)現(xiàn)自定義可變參數(shù)以及如何改變默認(rèn)的%d、%f、%s等格式字符。
#include <stdio.h>
#include <stdlib.h> // itoa() and ltoa()
#include <string.h> // strcat() and strlen()
// echo("$i, $s, $l, $c", arg1, arg2, arg3, arg4)
// $i -- int, $s -- string, $l -- long, $c -- char
void echo(char *fmt, ...)
{
int i, fmtlen = strlen(fmt);
int *args = (int *)((char *)(&fmt) +sizeof(char *));
char cbuff[BUFSIZ] = {'\0'}, nbuff[BUFSIZ] = {'\0'}; // #define BUFSIZ 512 in <stdio.h>
for (i = 0; i < fmtlen; i++)
{
if (('$' == fmt[i]) && ((i + 1) < fmtlen))
{
switch (fmt[i + 1])
{
case 's': strcat(cbuff, (char *)(*args));
break;
case 'c': cbuff[strlen(cbuff)] = (char)(*args);
break;
case 'i': itoa(*args, nbuff, 10); strcat(cbuff, nbuff);
break;
case 'l': ltoa((long)(*args), nbuff, 10); strcat(cbuff, nbuff);
break;
default: break;
}
++args, ++i;
}
else
cbuff[strlen(cbuff)] = fmt[i];
}
cbuff[strlen(cbuff) + 1] = '\0';
fputs(cbuff, stdout);
}
int main()
{
echo("arg_list = $i, $s, $l, $c", 2, "hello", 8, 'a'); // Si -- %d, $s -- %s, $l -- %ld, $c -- %c
return 0;
}

相關(guān)文章
C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信
通訊建立后首先由服務(wù)器端發(fā)送消息,客戶端接收消息;接著客戶端發(fā)送消息,服務(wù)器端接收消息,實(shí)現(xiàn)交互發(fā)送消息。本文主要介紹了C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信,感興趣的可以了解一下2021-05-05Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(Windows
這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】,圖文詳解介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03詳解C++中new運(yùn)算符和delete運(yùn)算符的使用
這篇文章主要介紹了C++中new運(yùn)算符和delete運(yùn)算符的使用,文章來自于微軟開發(fā)者文檔,因而根據(jù)Visual C++的一些特性來進(jìn)行講解,需要的朋友可以參考下2016-01-01C++ Boost Lockfree超詳細(xì)講解使用方法
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11