c-c++
文章平均质量分 86
守望之名
这个作者很懒,什么都没留下…
展开
-
scanf(“%*[\n]%[^\n]“,s)是什么意思?
在解释标题的用法之前,先看看其他的用法。不知道你有没有看到过scanf下面这样的用法:// 来源:公众号【编程珠玑】// 作者:守望先生#include<stdio.h>int main(void){ char a[128] = {0}; scanf("%[0-9]",a); printf("%s\n",a); return 0;}上面的代码什么意思呢?试一下几个输入输出:示例0:输入:13579输出:13579示例1:输入:121a原创 2020-12-26 10:28:37 · 3108 阅读 · 2 评论 -
这样设计API,让接口更加健壮!
原文链接:https://www.yanbinghu.com/2020/11/07/61329.html之前在《PIMPL-隐藏类的私有成员》中介绍了一种隐藏类的私有成员的方法,或者说隐藏接口实现细节的方法-PIMPL。假设提供的接口的入参比较复杂,可能有人会考虑使用结构体作为入参。当你考虑这么做的时候,灾难也将会随之而来……示例://来源:公众号【编程珠玑】//作者:守望先生//api.h#include<iostream>structParam{in...原创 2020-11-26 21:41:23 · 697 阅读 · 1 评论 -
后台程序实现不当导致磁盘满的问题
之前在《如何让程序真正地后台运行》一文中提到了程序后台运行的写法,但是里面的示例程序在某些场景下是会有问题的,这里先不说什么问题,我们先看看这个磁盘满的问题是怎么产生的,通过这篇文章你将会学习到大量linux命令的实操使用。找到导致磁盘满的程序当发现磁盘占用比较多的时候,可以通过下面的命令,查看各个挂载路径的占用情况:$df-hudev3.9G03.9G0%/devtmpfs784M2.0M782M...原创 2020-10-11 15:24:27 · 651 阅读 · 1 评论 -
PIMPL:隐藏接口的实现细节
前言有时候我们需要提供对外的API,通常会以头文件的形式提供。举个简单的例子:提供一个从某个指定数开始打印的接口,头文件内容如下://来源:公众号编程珠玑//作者:守望先生#ifndef_TEST_API_H#define_TEST_API_H//test_api.hclassTestApi{public:TestApi(ints):start(s){}voidTestPrint(intnum);private:in...原创 2020-10-11 15:18:31 · 447 阅读 · 1 评论 -
这才是现代C++单例模式简单又安全的写法
前言说到单例模式,很多人可能都已经很熟悉了,这也是面试常问的一个问题。对于单线程而言,单例的实现非常简单,而要写出一个线程安全的单例模式,曾经有很多种写法。有兴趣的可以参考这篇文章《单例模式很简单?你真的能写对吗》简单实现该文章中也提到,由于C++11及以后的版本中,默认静态变量初始化是线程安全的。The initialization of such a variable is defined to occur the first time control passes through its d原创 2020-09-06 21:53:15 · 384 阅读 · 0 评论 -
C语言数组还能这么用?学到了!
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码,对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢?//来源:公众号【编程珠玑】//作者:守望先生#include<stdio.h>structTest0{inta;intb;char*c;};structTest1{inta;...原创 2020-08-29 20:28:29 · 359 阅读 · 0 评论 -
32位程序和64位程序这些区别你知道吗?
我们在编写C/C++程序时,32位程序和64位程序的代码有何区别?如何编写既可以编译成32位程序又可以编译成64位程序的代码?代码上的区别实际上,对于32位程序和64位程序来说,代码上的区别不大,严格来说,甚至是一样的,它的主要区别在于一些基本数据类型占用的字节长度不一样(注:这里仅针对类Unix平台)类型 32位占用字节 64位占用字节 long 4 8 unsigned long 4 8 指针 4 8 当然这里的long包括一些原创 2020-06-26 09:14:00 · 2999 阅读 · 0 评论 -
一行注释也能影响代码运行?别不信!
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng没想到吧,一行注释也能影响运行结果也许你在某个段子里听说过,某行注释删掉后,程序竟然不能预期执行?真的会这样么?你还别不信。见证“奇迹” 1//来源:公众号【编程珠玑】 2//作者:守望先生 3#include<stdio.h> 4#include<math....原创 2020-04-12 08:37:49 · 8880 阅读 · 18 评论 -
高频面试题-如何交换两个变量值?办法没你想得那么多!
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxianshengC语言交换两个整型变量,你有哪些方法?那么多方法,又有哪几个可行?不可行的方法初学者最容易理解错的方法://来源:公众号【编程珠玑】//https://www.yanbinghu.com#include<stdio.h>voidswap(inta,intb){...原创 2020-01-11 20:32:58 · 2904 阅读 · 2 评论 -
解引用NULL会导致挂死?
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng解引用NULL指针为什么会出错,导致程序挂死?或者说访问内存地址为0的位置为什么会视为非法?先了解NULL参考《NULL,0,'\0'有何区别?》。解引用NULL解释问题之前,先描述问题。请看下面的代码://来源:公众号【编程珠玑】//https://www.yanbinghu...原创 2020-01-10 08:09:18 · 797 阅读 · 0 评论 -
生成随机数的方式你选对了吗?
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng生成随机数的N种方式首先需要说明的是,计算机中生成的随机数严格来说都是伪随机,即非真正的随机数,真正随机数的随机样本不可重现。那么我们来看看代码中有哪些方式可以生成随机数。randrand函数声明如下:#include<stdlib.h>intrand(void);...原创 2019-12-25 21:06:39 · 3471 阅读 · 0 评论 -
多线程排序-真香
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng在《系统编程-多线程》中已经了解了多线程的一些特点,其中包括快!那么今天就来看看如何利用多线程来排序。思路我们的思路是这样的: 假设有N个线程,则将数组数M据分为N组 每个线程对其中的一组数据使用库函数提供的快速排序算法 所有线程排序完成后,将每组排序好的数组合并 ...原创 2019-12-25 21:00:17 · 4161 阅读 · 2 评论 -
void*该如何理解?
原文地址:https://www.yanbinghu.com/2019/12/15/19682.html说到C就不得不提指针,而一提到指针,有一个是比较特殊的,那就是void*。void*到底是怎样的存在?指针类型的含义在说明void*之前,先了解一下普通指针类型的含义。//来源:公众号【编程珠玑】//main.c#include<stdio.h...原创 2019-12-18 19:10:34 · 1210 阅读 · 1 评论 -
系统编程-文件I/O
来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng我们都听过Linux下一切皆文件,实际上无论是普通的文件读写,还是网络IO读写,它们都有着类似的操作过程。本文通过基本文件IO操作,来了解Linux“一切文件”的读写。当然过程中穿插着很多其他内容。文件I/O过程在介绍具体的函数使用之前,我必须说明一下文件I/O的基本过程。它们类似过程如下:...原创 2019-12-14 10:51:16 · 367 阅读 · 0 评论 -
善用shared_ptr,远离内存泄露(文末福利)
来源:公众号【编程珠玑】作者:守望先生《为何优先选用unique_ptr而不是裸指针?》中说到,如果有可能就使用unique_ptr,然后很多时候对象是需要共享的,因此shared_ptr也就会用得很多。shared_ptr允许多个指向同一个对象,当指向对象的最后一个shared_ptr销毁时,该对象也就会自动销毁。因此,善用shared_ptr,能够远离内存泄漏。...原创 2019-12-12 21:26:53 · 698 阅读 · 0 评论 -
不可不知的三种缓冲类型
来源:公众号【编程珠玑】作者:守望先生原文地址:https://www.yanbinghu.com/2019/12/01/27836.html为什么有时候写入文件的内容却没有?没什么printf打印在终端的内容看不到?这一切背后有着怎样早为人知的秘密?今天来说说缓冲的事。也许你已经听说过三种缓冲模式,但是今天要讲的不止这些。缓冲为了减少使用read和write调用的次...原创 2019-12-07 21:13:52 · 1972 阅读 · 0 评论 -
如何让你的程序同时只能运行一个?
有些程序我们希望在一台机器上只有一个实例在运行,我在windows下也遇到过很多类似这样的程序,如QQ,它只允许同时运行一个。那么我们在Linux该如何实现这样的单例运行的程序呢?思路实现这样的程序方法很多,但是总体思路都是类似的: 1.启动程序,检测标志,判断是否有同样的程序运行,是则2,否则3 2.程序退出 3.程序启动,并设置标志,以便下次启动时检...原创 2019-12-02 21:32:08 · 3791 阅读 · 0 评论 -
聊点基础的--sizeof,strlen,数组,字符串在一起能整哪些坑?
对于初学者来说,sizeof,strlen,数组,字符串整在一起是痛苦的,它总能在某些莫名其妙的时候整一个措手不及。本文看看它们在一起能挖什么坑。例子在说明这些问题之前,先看一段代码,看看你是否都理解了。(注:以下代码结果为编译为64位程序后运行结果)//来源:公众号【编程珠玑】#include<stdio.h>#include<string.h>v...原创 2019-11-22 12:47:14 · 1042 阅读 · 2 评论 -
这个编程技巧别说我没告诉你
前言有读者在后台留言说用c写一篇有限状态机的推文,正好之前也用过,就分享一下吧。背景先举一个简单的例子,假设是这样的,一个小孩有两种状态,睡眠,清醒。睡的时候可能会撒尿,微笑,撒尿之后会转为清醒状态,而清醒的时候可能会笑,会吃,吃完之后会转会睡眠状态用C语言实现,一般写法可能是这样的://来源:公众号【编程珠玑】#include<stdio.h>enum...原创 2019-11-16 09:00:35 · 727 阅读 · 1 评论 -
为何优先选用unique_ptr而不是裸指针?
前言在《拥抱智能指针,告别内存泄露》中说到了内存泄漏问题,也提到了C++中的智能指针基本原理,今天就来说说类模板unique_ptr。在此之前,先回答读者的一个提问:C语言中该怎么办?有几点建议: 编写时尽量遵循函数内申请,函数内释放的原则 注意成对编写malloc和free 使用静态扫描工具,如《pclint检查》 使用内存检测工具,如valgr...原创 2019-11-11 21:16:45 · 1016 阅读 · 0 评论 -
拥抱智能指针,告别内存泄露
前言我们都知道,当申请的内存在不用时忘记释放,导致内存泄漏。长期来看,内存泄漏的危害是巨大的,它导致可用内存越来越少,甚至拖慢系统,最终进程可能被OOM(out of memory)机制杀死。C与C++中的内存泄漏在C语言中,我们用malloc申请内存,free释放内存;在C++中,也可以使用它们,不过对于自定义类型,常常会使用new申请,delete来释放。它们都有同样的问题,...原创 2019-11-07 21:39:02 · 2821 阅读 · 2 评论 -
C++和C中的const关键字有何区别?
前言在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。修饰普通变量--只读在C语言,虽然表面是不允许被修改,但是看下面的代码:#include<stdio.h>intmain(void){constinta=10...原创 2019-11-02 08:53:32 · 480 阅读 · 0 评论 -
有了它,再也不怕C中的复杂声明了
前言随着学习的深入,你可能慢慢地接触到越来越多的复杂声明,而这里有一个网站,帮你识别复杂的声明。试一试你知道下面的声明是什么意思吗?void(*signal(int,void(*)(int)))(int);没关系,访问https://cdecl.org/输入上面的内容就可以知道了:我们就得到了这个声明的含义:declare signal as fu...原创 2019-11-01 12:33:40 · 341 阅读 · 0 评论 -
几道C/C++小题,看看你会不会?
构造函数下面使用无参构造函数声明变量的方式对吗?为什么?应该如何修改?Testtest();答案参考《认真理一理C++的构造函数》。数组和指针下面代码的输出结果是什么?//实际中千万不要这么写#include<stdio.h>intmain(void){inta[5]={1,2,3,4,5};int...原创 2019-11-01 12:32:13 · 407 阅读 · 0 评论 -
作为一个Linux/C/C++开发工程师,聊聊对Python的看法
首发:公众号【编程珠玑】作者:守望先生前言首先说明,这不是软文。仅仅是个人看法,同时也会仍然坚持C/C++,毕竟要吃饭。近年来以及最近想必大家总能看到Python的身影,有的是频繁报道Python制霸编程语言排行榜,有的是总能看到各种Python的培训课程,作为主要使用其他语言的你,恐怕心里很难不会有悸动。那么应该如何看待Python?说说排行榜TIOBE 编程...原创 2019-10-29 12:33:15 · 2611 阅读 · 4 评论 -
printf每天都在用,你知道它的变长参数是怎么实现的吗?
首发:公众号【编程珠玑】作者:守望先生原文:https://www.yanbinghu.com/2018/09/22/24370.html前言变长参数,指的是函数参数数量可变,或者说函数接受参数的数量可以不固定。实际上,我们最开始学C语言的时候,就用到了这样的函数:printf,它接受任意数量的参数,向终端格式化输出字符串。本文就来探究一下,变长参数函数的实现机制是怎样的,以及我们...原创 2019-10-17 07:50:44 · 1076 阅读 · 0 评论 -
一文彻底搞懂重载函数匹配
前言前面我们讲到了《函数重载》,有了函数重载之后,就需要确定某次调用需要选用哪个函数。这个过程可以称之为函数匹配或者重载确定。大多数情况下,我们都很容易能够确定某次调用需要选用哪个函数,但事实上不尽然。但通过本文将彻底理清重载函数匹配 匹配过程为便于说明,将函数匹配分为三个阶段,确定候选函数,确定可行函数,确定最佳匹配函数。确定候选函数候选函数也就是和被调用的函数同名,并且...原创 2019-01-02 19:26:37 · 685 阅读 · 0 评论 -
让你的代码更加优雅的编程技巧
前言前面我们讲到了《函数指针》,今天我们看一个编程技巧-函数跳转表。我们先来看如何实现一个简易计算器。初始版本让我们实现一个简易计算器,我们首先能想到的方式是什么?switch语句或者if else语句。没错,初学就会想到的两种方式,我们来看看这种实现方式。这里我们选择switch语句,定义一个操作类型,用户选择操作类型与操作类型匹配时,选择对应的处理函数进行处理,calc1.c...原创 2019-01-24 21:16:55 · 474 阅读 · 0 评论 -
C++类-有了对象之后
原文地址:https://www.yanbinghu.com/2019/07/28/63773.html前言无论是在Java还是Python中,都有类的概念,类的基本思想是数据抽象和封装,一个类定义了一种数据类型以及相关的操作。C++中类是怎样的呢?本文将结合C语言,来介绍C++中的类。乐一乐问:C++的书为什么比C厚那么多?答:有了对象后就是麻烦。虽然这只是调侃,但不得不承认,C+...原创 2019-08-02 12:50:27 · 555 阅读 · 2 评论 -
C++之vector
前言标准库类型vector表示对象集合,并且所有的对象类型相同。由于它常常“容纳”其他对象,因此常称作容器。vector也是一个类模板。编译器根据模板创建类型或函数的过程称为实例化,当使用模板时,需要指出编译器应把类或函数实例化成何种类型。初始化与string类型一样,vector也有很多种方式进行初始化:vector<int>v1;//v1是一个空的...原创 2018-11-08 21:00:51 · 474 阅读 · 0 评论 -
认真理一理C++的构造函数
原文地址:https://www.yanbinghu.com/2019/08/11/25996.html本文要点为什么需要构造函数默认构造函数什么时候有构造函数初始值有哪几种方式给出?如何使用构造函数什么是委托构造函数?如何禁止拷贝形式的初始化?前言我们在C语言中使用堆栈中的变量时,常常需要给它赋初始值,用于避免使用到了不可预知的值。同样的,在C++中也需要有这样的动作,只是...原创 2019-08-13 08:08:31 · 563 阅读 · 0 评论 -
这本书很优秀,但不适合入门
来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/09/15/58540.html前言一本合适的入门书能让你学习的时候信心倍增,如饥似渴,而一本不合适的入门书让你望而却步,怀疑人生。它很优秀C++相对于其他语言来说,是一门较为复杂的语言,传言一年精通,三年熟悉,五年了解,十年用过。关于C++的言论实在太多,鉴于本人使...原创 2019-09-16 21:42:41 · 2689 阅读 · 13 评论 -
这些C++面试题你都会了吗
来源:牛客网编辑:公众号【编程珠玑】秋招进行中,搜罗了一些面试题,看看你会不会?一、基础知识基本语言1、说一下static关键字的作用2、说一下C++和C的区别3、说一说c++中四种cast转换4、请说一下C/C++ 中指针和引用的区别?5、给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码6、怎么判断一个数是二的倍数...转载 2019-09-20 21:09:34 · 1512 阅读 · 0 评论 -
为什么说++i的效率比i++高?
来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/09/09/58833.html前言不知道你是否听说过++i比i++快的说法,真的如此吗?++i与i++的区别这两个表达式从我们初学编程语言的时候就会接触到。前者是自增后取值,后者是取值后自增。我们看一个简单的例子。#include<iostream&g...原创 2019-09-28 15:05:36 · 2009 阅读 · 0 评论 -
一句话帮你理解typedef的用法
来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/09/01/25828.html前言在C语言中typedef用来给复杂声明定义别名非常的方便,不过有时候typedef在复杂声明中不好理解。本文关键的一句话帮你理解ytpedef的用法。typedef常见应用场景在这之前,我们来看看一些常见应用场景。为特定含义的类型...原创 2019-09-28 20:42:10 · 702 阅读 · 1 评论 -
这些C++工程师面试题答案收藏好喽
来源:牛客网编辑:公众号【编程珠玑】在《这些C++工程师面试题你都会了吗?》分享了一些面试题,应读者强烈要求给出答案,这里给出一部分,答案仅供参考!祝秋招顺利!说一下static关键字的作用参考回答: 全局静态变量 在全局变量前加上关键字static,全局变量就定义成一个全局静态变量. 静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动...转载 2019-10-02 10:32:35 · 12210 阅读 · 29 评论 -
NULL,0,`0`,`\0`,"0"你分得清吗?
来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/09/19/18180.html前言在C语言中,我们有时候看到NULL,有时候也看到'\0',那它们之间有什么区别呢?本质本质来说,NULL,0,'\0'都是一样的,都是值0。是的,你没有听错。说到这本文差不多应该结束了。不过为了不被打,还是继续说一说。它们...原创 2019-10-04 16:08:32 · 6433 阅读 · 3 评论 -
C++是如何调用C接口的?
来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com/2019/08/25/29412.html前言如何在C++代码中调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C++如何调用C代码接口。C++如何调用C接口为什么会有这样的情况呢?想象一下,有些接口是用C实现的,并提供了库,那...原创 2019-10-08 20:58:39 · 1291 阅读 · 4 评论 -
C++之旅-函数重载
前言函数重载指的是一个作用域内的几个函数名字相同但是形参列表不同。这些函数执行操作类似,但是接受的形参类型不一样,编译器会根据传递的实参类型选择对应的函数调用。本文将简单介绍C++中的函数重载。定义重载函数假设有一个计算图形面积的函数,它可以是计算三角形,圆形或正方形的面积。函数的名字都相同,只是根据传入的图形类型来选择不同的函数来计算面积,程序清单如下:#include <...原创 2018-11-28 21:27:16 · 796 阅读 · 0 评论