看这篇文章之前,我觉得可以先看看下面这篇文章

看printk引发的一点思考

不管我们用的printk还是printf,它们的核心都是可变参数的函数,所以可以拼接很多参数传递给函数实体,然后函数实体里面可以通过某种方式解析这些参数。

看看这个题目

过滤一组数据,要求过滤之后头尾部都没有',' ,而且也不能用if 语句来实现。

例如、 输入:a[6]={1,2,3,4,5,6} 输出:1,2,3,4,5,6

使用if 实现之

正常的写法是用到 if 的,已经背离了题目的要求。

不过,我说下自己对这个问题的看法,我们在做项目做需求的时候,产品经理每天拿着刀在后面威逼利诱着,已经是火烧眉毛的事情,能做出对方想要的要求已经是不易了,哪里有时间去思考那些浮夸的写法。

这也是做科研和做项目的不同,我写文章,做分享,是怀着深耕去的,但是做项目,我们是需要把控时间节点的,每个人站在不同的角度,就会看到不同的哈姆雷特。

#include<stdio.h>int 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;
}

大神的写法

这代码来源于知乎的一个题主,他在回答中分享了这个写法,非常巧妙。

#include <stdio.h>
int 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.c
static 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 <stdlib.h>
#include <stdio.h>
#include <string.h>#include <stdarg.h>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;
}

输出

20
50
90
140
160
5,160--------------------------------
Process exited after 0.08141 seconds with return value 0
请按任意键继续. . .

跟上面例子不同之处在于,printf 函数传入的是字符串,既然是字符串,那就离不开指针「地址」,既然是指针,就离不开指针的指向位置这个问题。

先举个例子

#include <stdio.h>int 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
请按任意键继续. . .

如果能明白上面的问题这个例子的话,拿对前面那个代码再拿过来瞧瞧,应该就会有一种豁然开朗的感觉了。

#include <stdio.h>
int 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文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

秒,在解答这个C语言题目上,我们都败了相关推荐

  1. 桌面计算机里没有桌面显示不出来怎么办,电脑屏幕桌面上东西都不显示了怎么办...

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 电脑屏幕桌面上东西都不显示的解决方法是: 1.首先使用鼠标右键单击桌面空白处,然后在弹出的菜栏点击[查看]选项. 2.此时可以看到 ...

  2. c语言在屏幕上显示字母,【求C语言高手帮忙解答1、在屏幕上显示一行字符串:”hell-查字典问答网...

    求C语言高手帮忙解答 1.在屏幕上显示一行字符串:"helloworld!". 2.从键盘上输入两个数,放入整型变量a,b当中,求两数之和c=a+b,两数之差d=a-b. 3.从键 ...

  3. 2010C语言题目解答,2010C语言题目解答讲解.doc

    2010C语言题目解答讲解 2010高考真题详解 第一套 [程序填空] 题目:对只包含'-'和字母字符的字符串str进行如下处理: 删除str中前导和尾部连续的'-'字符,保留串中字母字符以及字母间的 ...

  4. 100例C语言经典编程题 | 浙大版C语言题目集第三版,助力你C语言从入门到精通

    获取每道题详细解答请在公众号[C you again]"C语言题目集"栏目查看. 下载pdf版本请在公众号[C you again]回复"c-pdf"自行获取. ...

  5. 百度作业帮c语言查题目,c语言题目看程序写结果a=5,b=4,c=3,d:d=(abc)

    请大家看一下下面的C语言程序哪里出错了,题目是求一元二次方程的解. 您的程序一共有两个地方有问题,第一是读取输入的时候,a,b,c定义成double,所以读入的时候不能用%d,而应该:scanf(&q ...

  6. c语言掌上通,计算机二级C语言掌上通在哪下载安装?计算机掌上通好用吗?

    计算机二级C语言掌上通在哪下载安装?计算机二级C语言掌上通好用吗?相信很多想要考计算机二级C语言的学生都在努力的复习背题库,而现在只要使用计算机二级C语言掌上通就能够随时随地刷题了. 一.计算机二级C ...

  7. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    <从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例>要点: 本文介绍了从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例,希望对您有用.如果有疑问,可 ...

  8. 转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    注: 转自 微信公众号"高可用架构":从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一 ...

  9. R语言题目及参考答案(3)

    本次题目主要是R语言统计推断方面的,包括点估计的矩法估计和极大似然估计,区间估计的单正态总体的均值和方差的估计.两正态总体的参数估计.比率的估计和样本容量的确定等等.需要代做r语言作业的直接加QQ19 ...

最新文章

  1. 【AJAX】反向Ajax第1部分:Comet介绍
  2. python第三方插件登录网易音乐_python3-使用requests模拟登录网易云音乐
  3. [转] Boost智能指针——scoped_ptr
  4. php文件引用问题,Php引用文件引起的空白行问题(UTF-8)
  5. WebUserControl归纳
  6. vue 传递多行数据_vue父组件向子组件传递多个数据的实例
  7. python判断、创建文件夹
  8. spring整合logback
  9. 科略教育:《三项管理技能企业CEO不得不修炼》
  10. 拉式工序不允许倒冲财务仓
  11. 智能家居APP原型设计(附下载链接)—基于物联网的终端设备设计研究—Axure9高保真原型设计
  12. 情侣博客源码php,wordpress如何搭建简单的情侣博客
  13. redis 使用geo来存储地理经纬度信息
  14. python中除法运算定律_数学有哪几种简便运算方法?(除了加、乘法交换、结合律,减、除法的性质)...
  15. linux sed尾行符号,用sed流编辑器处理特殊符号
  16. 魅族系统应用卸载 adb卸载/禁用Android系统内置应用
  17. C++高频面试问题总结
  18. 通知:首届CISM大赛华东赛区决赛将于30日在马鞍山举行
  19. 恶心的英特尔的RST驱动
  20. acrobat PDF删除部分_PDF编辑器Adobe Acrobat DC 2019

热门文章

  1. PHP_Smarty
  2. android 安装应用程序apk安装不了
  3. JadClipse eclipse反编译插件
  4. win7中输入文件夹首字母跳到相应的文件或者文件夹,却在搜索栏出现输入的字母...
  5. “BindingNavigator”如何在删除前弹出确认框?
  6. 黑马程序员——java语言基础——面向对象
  7. ASP.NET AJAX - Timer控件之摆放位置的影响
  8. solr基本查询和高级查询
  9. 一对一 一对多 多对多
  10. Python 第三方模块之 selenium - 模拟操作 Chrome 浏览器