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

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

看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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux kernel 同步机制(下篇)

之前的文章Linux kernel同步机制在上一部分&#xff0c;我们讨论了最基本常见的几类同步机制&#xff0c;这一部分我们将讨论相对复杂的几种同步机制&#xff0c;尤其是读写信号量和RCU&#xff0c;在操作系统内核中有相当广泛的应用。读写信号量&#xff08;rw_semaphore&…

白话设计模式——Abstract Factory

Abstract Factory&#xff0c;把英文直接翻译过来的话就是“抽象工厂”&#xff0c;既然是工厂&#xff0c;那就肯定是生产产品的地方。不过&#xff0c;它不是生产同一类的产品&#xff0c;而是生产同一系列的产品。举个例子&#xff0c;广州本田现在生产3种汽车&#xff0c;O…

工程师实战:单片机裸机程序框架是怎样炼成的?

前言 前不久&#xff0c;我有位做测试的朋友转去做开发的工作&#xff0c;面试遇到了一个问题&#xff0c;他没明白&#xff0c;打电话问了我。题目大概就是&#xff1a;在单片机裸机开发时&#xff0c;单片机要处理多个任务&#xff0c;此时你的程序框架是怎样的呢&#xff1f…

c 语言指针教学视频,[C语言] 猎豹网校 C和指针视频教程

资源介绍21days_Cpp_二进制和十六进制.mp4xa0xa080x86_内联汇编.mp4xa0xa0ABG2C_for_循环.mp4xa0xa0ABG2C_关系运算符.mp4xa0xa0ABG2C_字符串.mp4xa0xa0ABG2C_循环.mp4xa0xa0ABG2C_数学运算.mp4xa0xa0ABG2C_更高级的运算符.mp4xa0xa0ABG2C_测试多个值.mp4xa0xa0ABG2C_终止循环.…

图解http

今天是周五&#xff0c;按照正常的情况&#xff0c;今天下班后将会经历一周中最愉快的时光&#xff0c;愉快的时间总是会有那么一些短暂&#xff0c;所以我就送给大家一个资料 「图解http」这是一个微信好友发给我的&#xff0c;他一直给我发送了很多很多消息&#xff0c;比如什…

为什么执行自己的程序要在前面加./

前言在Linux中&#xff0c;我们执行内置命令时&#xff0c;直接输入命令名称即可&#xff0c;如&#xff1a;$ mv a b #将a重命名为b而在执行自己写好的程序时&#xff0c;却要带上./&#xff0c;例如&#xff1a;$ hello hello: command not found $ ./hello hello world这是为…

C语言怎么计算数据类型范围?

之前在网上看到的一个讨论&#xff0c;是谁决定了数据类型的范围&#xff1f;比如说&#xff0c;怎么确定 char 就是 -128~127 &#xff0c;而不是 -127~128 呢&#xff1f;说下规定signed 的取值范围是 -(2N-1) to 2N-1 - 1unsigned 的取值范围是 0 to (2N-1) (2N-1 - 1)只要…

双十一为何规则复杂,套路多多

为啥不直接打5折?为了让你把“穷人”俩字写到自己脸上啊。 双十一快到了&#xff0c;今年我又一次有了不太想参加的感觉。作为一个阅读理解不太灵光的人&#xff0c;去年的活动我就整得不太明白——优惠券都是十块十块的&#xff0c;也不知道该咋用;还有预付款、整点秒杀之类的…

团建是什么鬼?

2012年我入职TCL&#xff0c;在TCL我体会到了团队建设的文化&#xff0c;也正是经历了那段职场&#xff0c;我明白了很多「可意味不可言传」。那时候我们经常五十成群出去吃饭、喝酒、唱歌&#xff1b;上学那会我很不喜欢团队活动&#xff0c;特别是室内的活动&#xff0c;总感…

Alpha 答辩总结

【Alpha展示评审表格】 小组序号小组名称格式&#xff08;20%&#xff09;内容&#xff08;20%&#xff09;PPT&#xff08;20%&#xff09;演讲&#xff08;20%&#xff09;答辩&#xff08;20%&#xff09;总分1天机组1515151516762PMS1617171616824“像我这么能打的还有五个…

一粒沙子变成芯片的全过程

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言嵌入式Linux微信扫描二维码&#xff0c;关注我的公众号

要学会拒绝

Img「聊天截图」这是今晚上跟一个朋友聊天的截图&#xff0c;之后、突然想到这个话题&#xff0c;今年因为疫情&#xff0c;很多人抱怨工作不好找&#xff0c;我这个朋友&#xff0c;也是在疫情之下&#xff0c;可能是干得不开心&#xff0c;也可能还是干得不开心&#xff0c;可…

linux设备模型之kset/kobj/ktype分析

1. 概述今天来聊一下Linux设备模型的基石&#xff1a;kset/kobject/ktype。sysfs文件系统提供了一种用户与内核数据结构进行交互的方式&#xff0c;可以通过mount -t sysfs sysfs /sys来进行挂载&#xff1b;Linux设备模型中&#xff0c;设备、驱动、总线组织成拓扑结构&#x…

VLAN 路由实验图解

VLAN 路由实验图解(交换机为cisco1900系列)注&#xff1a;PC1&#xff1a;192.168.1.2 255.255.255.0PC2&#xff1a;192.168.2.2 255.255.255.0PC3&#xff1a;192.168.1.3 255.255.255.0PC4&#xff1a;192.168.2.3 255.255.255.0Fa0/0.1&#xff1a;192.168.1.1 255.255.255…

第 120 场双周赛 解题报告 | 珂学家 | 前后缀拆解 启发式合并

前言 忘名可以再记&#xff0c;回忆永不再来 整体评价 好像有一段时间没写周赛题解了&#xff0c;_. 感觉今天手感特别好&#xff0c;下午的几场比赛&#xff0c;包括传智杯都能打出超神战绩。 T3这题属于前后缀拆解&#xff0c;然后单调栈上二分(可以引入哨兵机制)&#xf…

音频系统,Alsa 里面的buff 是怎么计算的?

相关文章(干货)Ai音箱和Linux音频驱动小谈Linux ALSA 图解我在MTK平台下调试音频ALSA我们知道声音是模拟信号&#xff0c;模拟信号转成数字信号就一定有大小&#xff0c;既然有大小&#xff0c;那我们就需要开辟内存来保存这些数据。---- 我们知道&#xff0c;视频流的一帧就是…

用一句话证明你是程序员,你会怎么说

这个文章没有正文突然想到的一个话题&#xff0c;感觉很有意思如果用一句话透露出你是一个程序员你会怎么表露自己了&#xff1f;留言偷偷告诉我&#xff1f;

空间换时间,查表法的经典例子

前言 上一篇分享了&#xff1a;C语言精华知识&#xff1a;表驱动法编程实践这一篇再分享一个查表法经典的例子。我们怎么衡量一个函数/代码块/算法的优劣呢&#xff1f;这需要从多个角度看待。本篇笔记我们先不考虑代码可读性、规范性、可移植性那些角度。在我们嵌入式中&#…

Linux内核系统架构介绍

28年前(1991年8月26日)Linus公开Linux的代码&#xff0c;开启了一个伟大的时代。这篇文章从进程调度&#xff0c;内存管理&#xff0c;设备驱动&#xff0c;文件系统&#xff0c;网络等方面讲解Linux内核系统架构。Linux的系统架构是一个经典的设计&#xff0c;它优秀的分层和模…

这道笔试题竟然运行不出错

#读者提供的面试题下面这张截图是一个读者在面试的时候遇到的题目&#xff0c;是哪个公司的我就不说出来了&#xff0c;我在微信朋友圈发了这个题目后&#xff0c;有几个好友给我留言说自己也写了这道题。题目&#xff1a;下面这段代码有什么问题&#xff1f;#后续然后我就用这…