一個va_list的奇技淫巧

需求

有時候需要使用vsscanf接收void**的指針列表,但是vsscanf接收的是va_list。

方法

抓耳撓腮一晚上,終於解決:

void vssf_pnt(char* str, char* format, ...)
{
    va_list args;
    va_start(args, format);
	  va_list ap = va_arg(args, va_list);
    vsscanf(str, format, ap);
    va_end(args);
}  


int main(void){
void** pntList = NULL; 
	int a,b;
	char str1[10],str2[10];
	float k;


	pntList = malloc(3 * sizeof(void*));
	pntList[0] = (void*)(&a);
	pntList[1] = (void*)(&b);
	
	vssf_pnt("115200,8","%d,%d",pntList);
	printf("a is %d, b is %d\r\n", a, b );
	
	pntList[0] = (void*)(&a);
	pntList[1] = (void*)(str1);
	pntList[2] = (void*)(&b);
	vssf_pnt("32, apple,56","%d,%[^,],%d",pntList);
	printf("~~~~~~\r\n%s\r\n",str1);
	printf("a is %d, b is %d\r\n", a, b );
	
	free(pntList);
}

總結

va_list太難用了。這裏用到va_arg的一個類型轉換的方法,來解決問題。
目前沒看到別人用過,也許是太危險。
在keil mdk沒問題,用visual studio編譯沒問題。用gcc編譯有問題。clang編譯可通過,但結果不正確。原因是底層對於va_list的定義不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章