本文共 2740 字,大约阅读时间需要 9 分钟。
看这篇文章之前,我觉得可以先看看下面这篇文章
不管我们用的printk还是printf,它们的核心都是可变参数的函数,所以可以拼接很多参数传递给函数实体,然后函数实体里面可以通过某种方式解析这些参数。
看看这个题目
过滤一组数据,要求过滤之后头尾部都没有',' ,而且也不能用if 语句来实现。
例如、 输入:a[6]={1,2,3,4,5,6} 输出:1,2,3,4,5,6
使用if 实现之
正常的写法是用到 if 的,已经背离了题目的要求。
不过,我说下自己对这个问题的看法,我们在做项目做需求的时候,产品经理每天拿着刀在后面威逼利诱着,已经是火烧眉毛的事情,能做出对方想要的要求已经是不易了,哪里有时间去思考那些浮夸的写法。
这也是做科研和做项目的不同,我写文章,做分享,是怀着深耕去的,但是做项目,我们是需要把控时间节点的,每个人站在不同的角度,就会看到不同的哈姆雷特。
#includeint main(){ int arr[6] = {1,2,3,4,5,6}; int is_first = 1; int i = 0; for(i = 0; i < 6; i++){ if(is_first){ printf("%d",arr[i]); is_first = 0; }else { printf(",%d",arr[i]); } } return 0;}
大神的写法
这代码来源于知乎的一个题主,他在回答中分享了这个写法,非常巧妙。
#includeint main(void) { int a[6] = {1, 2, 3, 4, 5, 6}, i; for (i = 0; i < 6; i++) { printf(",%d" + !i, a[i]); } return 0;}
https://www.zhihu.com/question/412135686/answer/1396323238
先不解释
我们看看printf函数原型
typedef char *va_list;#define _AUPBND (sizeof (acpi_native_int) - 1)#define _ADNBND (sizeof (acpi_native_int) - 1)#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))#define va_end(ap) (void) 0#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))//start.cstatic char sprint_buf[1024];int printf(char *fmt, ...){ va_list args; int n; va_start(args, fmt); n = vsprintf(sprint_buf, fmt, args); va_end(args); write(stdout, sprint_buf, n); return n;}
里面的几个宏作用我在之前的文章里面也有有提到。
关于va_list ,我写了一个实例,比较简单
#include#include #include #include int sum(int size, ...){ va_list vp; int s = 0; int i = 0; va_start(vp, size); for (i = 0; i < size; ++ i) { s += va_arg(vp, int); printf("%d\n", s); } va_end(vp); printf("%d,%d\n", size, s);}int main(){ sum(5, 20, 30, 40, 50, 20); return 0;}
输出
2050901401605,160--------------------------------Process exited after 0.08141 seconds with return value 0请按任意键继续. . .
跟上面例子不同之处在于,printf 函数传入的是字符串,既然是字符串,那就离不开指针「地址」,既然是指针,就离不开指针的指向位置这个问题。
先举个例子
#includeint strput(char * str){ printf("%s\n",str);}int main(){ strput("Linux"+1); return 0;}
输出
inux--------------------------------Process exited after 0.08051 seconds with return value 0请按任意键继续. . .
如果能明白上面的问题这个例子的话,拿对前面那个代码再拿过来瞧瞧,应该就会有一种豁然开朗的感觉了。
#includeint main(void) { int a[6] = {1, 2, 3, 4, 5, 6}, i; for (i = 0; i < 6; i++) { printf(",%d" + !i, a[i]); } return 0;}
首先
",%d" + !i
是一个字符串的地址,这个地址 通过 i 来对它进行了偏移。
如果是第一个数组,i 对应的值是 0,所以就不会打印出 「 , 」这个字符了。
推荐阅读:
嵌入式Linux
微信扫描二维码,关注我的公众号
转载地址:https://linus.blog.csdn.net/article/details/108231481 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!