![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
大猫学C/C++
文章平均质量分 51
南郭竽
这个作者很懒,什么都没留下…
展开
-
对std::unique_ptr 的误解
它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何 C++ 标准库算法。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用 make_unique Helper 函数。不过出于性能考虑,防止内存泄漏,在二次赋值之前应该去释放之前的指针。比如上面这段介绍,还有各种其他的,让我以为其只能被。原创 2023-09-24 16:14:54 · 279 阅读 · 0 评论 -
c++ 中的函数参数的值传递
首先函数的调用栈是 main() -> grade() -> median() . 函数实参是在main() 里面创建的。写 c++ 程序的时候要特别小心这种函数参数的传递。稍不注意就会出现问题。函数的时候,这里传入的是一个常量引用,所以这里不会去创建对象,并且保证。,所以这里会进行一个拷贝赋值,也就是创建了一个新的对象。下面看一段代码并思考,为什么这里的。里面去进行排序,不会影响到原来的。原创 2023-01-12 05:17:46 · 222 阅读 · 0 评论 -
花括号匹配 c实现
花括号的匹配。从逻辑上看,分几种形式:{ { { }}}{ {} {} }{} {} {}以上3种都是匹配的。所以逻辑处理的时候要考虑这些情况。简单说一下判断逻辑。遇到 {的时候,要去看之前有没有 }. 有的话要去消掉前面的匹配记录,并记录这次的;如果之前没有出现过},那就直接统计。没有的话,直接统计。遇到 } 的时候就直接统计。最终比较二者的数量即可。另外如果已经开始统计 } 了,就不能继续统计{了,否则 }{也会被认为是匹配的了。给出一个通用的实现方案:// 通用实现方案,匹配花括号。(原创 2020-12-05 23:34:38 · 395 阅读 · 0 评论 -
c 将任意长度的多行的输入打印到控制台,前面加上行号
如题。发现 c 里面即使是很简单的问题处理起来都是比较麻烦的。比如标题里面的这个小问题。这个问题首先要分析。既然是任意长度,定义固定长度的数组去接收输入就不合适了。malloc 也不行,还是因为不知道大小,不知道 malloc 多大的内存。既然这样,我想到使用 putchar()/ getchar() 这组函数去实现。如果使用这组函数去实现的话,需要注意一个问题,就是所谓的缓冲区问题。什么是缓冲区问题?就是我调用 getchar() 之后,就可以在控制台输入了,但是无论我是输入一个字符还是一行原创 2020-12-01 23:23:03 · 266 阅读 · 0 评论 -
macOS下 vscode 配置 c++ debug
网上看到很多文章,但一直配置不成功。都准备放弃了。然后稀里糊涂的配置成功了。估计没什么帮助,还是简单记录一下。首先我使用 cmake 进行程序编译的。(其实跟这个没关联)我配置成功后发现起作用的就是一个文件.vscode/launch.json.配置成功之后,通过菜单栏上面 Run - Start Debugging 按钮(快捷键F5)开始调试。(先要打断点,并且编译生产目标二进制文件。)插件说明,没有安装code lldb 这个插件,发现不需要。安装了c++ debug默认插件,也就是官方插件原创 2020-12-01 22:03:03 · 531 阅读 · 0 评论 -
c++11 std 之美
第一次感觉到了程序之美.就是下面这个简单的代码.#include <map>#include <set>#include <string>#include <iostream>#include <vector>#include <iterator>#include <algorithm>#incl...原创 2020-01-20 11:58:20 · 337 阅读 · 4 评论 -
c++ 数组,函数指针
先看一个极其复杂的函数声明:std::string (*(*returnFunction(std::string (*(*pf)(std::initializer_list<std::string> list))[5]))(std::initializer_list<std::string> list))[5];特别长,一页几乎不能显示完全。然后看其函数名,参数类型...原创 2019-12-28 14:41:52 · 270 阅读 · 0 评论 -
Segmentation fault (core dumped)
c++ 中经常出现 这个错误[ Segmentation fault (core dumped) ],很类似java中经常出现的空指针异常。其实,c++ 的这个错误,很多时候就是空指针异常。下面看一段代码:int main(){ int a = 13; int b = 7; const int LENGTH = 9; // c++ 中的空指针,及显示...原创 2019-12-20 11:44:43 · 582 阅读 · 0 评论 -
cxx: 读写文本文件操作
c++中读写文本文件的操作比较方便,如下:#include <iostream>#include <fstream>using namespace std;int main() { ofstream *outFile = new ofstream; outFile->open("duck.txt"); *outFile << "hello duck";// 写文件 ou原创 2017-12-03 09:53:53 · 733 阅读 · 0 评论 -
cxx: 如何顺利地读取输入的首字符
在实际场景中,可能需要读取首字符,然后后面的内容不要了。但是按照c++中cin的尿性,会帮你保留剩余的字符在缓冲区,然后下次读取的时候,会把之前缓冲的,没有读到的字符给你。这往往不是我们想要的,我们只要首字符,然后后面的应该被全部丢弃。基于此需求,我写了一个简单小巧的函数,用于读取首字符,然后剩下的全部丢掉。#include <iostream>using namespace std;char ge原创 2017-12-03 11:25:12 · 387 阅读 · 1 评论 -
cpp: 统计文本文件中的字符数量
c++中打开文本文件,读取字符数量是一个比较简单的操作。#include <iostream>#include <fstream>using namespace std;int main() { fstream fin; fin.open("dcb.txt"); char ch; int counter = 0; while (fin && fin.get(ch原创 2017-12-03 12:53:25 · 4153 阅读 · 0 评论 -
cpp: 小综合,读取文本中的数字与字符串
看一个小案例,怎么从文本文件中读取内容,并将读到的数字行,保持为数字,读到的字符串,保存为字符串。 比如有一个文件donation.txt,里面的内容是:4Sam Stone2000Freida Flass100500Tammy Tubbs5000Rich Raptor55000这种要怎么读呢? 怎么处理这种混合的输入?我是全部按照字符去读取的,然后将每行存到一个字符串中,整体存到原创 2017-12-03 14:22:48 · 1925 阅读 · 0 评论 -
cpp: complex 的简易实现
加深对操作符重载的熟悉程度… //// Created by cat on 2018/1/1.//#ifndef CPP02_COMPLEX0_H#define CPP02_COMPLEX0_H#include <iosfwd>namespace complex0 { class Complex { private: double原创 2018-01-01 23:45:15 · 585 阅读 · 0 评论 -
cpp: 统计输入的单词数量1
编写一个程序,它使用一个char数组和循环来读取每一个单词,直到用户输入done为止。随后,该程序指出用户输入了多少个单词(不包括done在内)。下面是该程序的运行情况:(粗体表示用户输入) Enter words (to stop,type the word done): anteater birthday category dumpster envy finagle geome原创 2017-12-02 12:38:17 · 772 阅读 · 0 评论 -
cpp:变量的定义与Java中的不同
在Java中,除了基本类型的变量,任何变量在定义之后,使用之前,必须先进行赋值,否则调用时就会抛出空指针异常,而对于基本类型的变量,如果是函数内变量,必须赋值,否则编译报错。而c++中,函数内定义的任何变量,系统都会自动分配内存单元,也就是说,可以不进行赋值,而直接调用。比如,下面的代码,在c++中是正常合法的代码,但是在java中就会抛空指针异常:#include <iostream>#incl原创 2017-12-11 00:10:47 · 453 阅读 · 0 评论 -
cpp: 使用typedef定义函数指针
Java在对于oop的封装上面抽象程度非常的高;但是对于函数,java里面的函数或者方法,可以说是非常基础或者低级。纵观java的语言特性,没有对函数有更高程度的封装。但是,除了在oop方面的抽象,在函数方面,也可以有很高程度的抽象。这一点,在javascript / python / c /c++上面就有所体现。如果之前没有接触过对于函数的抽象,那么第一次接触会觉得比较难以理解。比如c++原创 2017-12-10 21:35:07 · 6243 阅读 · 0 评论 -
c: string 字符指针与字符数组的区分
来看一段简单的代码,以区分字符指针与字符数组在表达字符串时的一些区别。#include <stdio.h>#include <string.h>int main(int argc, char const *argv[]){ char * str = "Kotlin"; // str[0] = 'J'; // Bus error:10 puts(str); cha原创 2017-11-21 22:33:41 · 1185 阅读 · 0 评论 -
cpp: 利息与复利的追赶
小明有100块钱,小红也有一百块钱。小明存100块钱的利息是每年10%,但是没有复利。小红存100块钱的利息是每年5%,但是有复利。也就是说,第二年,小红的本金相当于105块,小明依然是100块。#include <iostream>using namespace std;int main() { const int Init = 100; double daphne = Init;原创 2017-11-30 21:56:33 · 334 阅读 · 0 评论 -
cpp: 丢弃多余输入
之前在处理字符及数字的时候都采取了丢弃多余输入的方式来确保下次接收的是新的输入,而不是上次输入的未输出缓冲。为了简单明了,我决定写一个通用的函数专门用于处于多余的输入。#include <iostream>using namespace std;void dropInput() { while (cin && cin.get() != '\n')continue; cin.cle原创 2017-12-09 10:30:48 · 592 阅读 · 0 评论 -
c:const array
如何理解const array:const int times[3] = {11,22,33};times[1] = 55; // error --> 编译错误。void func(const int* arr,int len){ arr[0] += 2; // error --> 编译错误。}原创 2017-11-19 21:05:35 · 453 阅读 · 0 评论 -
cpp:处理字符串与数字的混合输入(动态数组)
c++中可以很方便的使用动态数组以及结构,也可以很方便的输入输出。不过,对于混合输入,特别是字符串与数字的混合输入的时候,还是需要一点注意。对于c++中数组,以及结构的数组也要留意一下,当前的变量对应的是指针,还是对象,或者是值?下面是一个简单的案例,收集用户的车子厂商,以及生产年份,并输出相关收集的内容。#include <iostream>#include <cstring>using na原创 2017-12-01 00:59:00 · 2065 阅读 · 0 评论 -
cpp: ostream setf() 设置格式状态方法的初使用
osstream的setf(iso_base::fmtflags) , width(n) , precision(n)是用来设置格式状态的。这种格式状态,可以体现在控制台输出,也可以体现在文件中。(多态)下面是一个示例程序,显示了这些格式化方法的使用示例。#include <iostream>#include <fstream>using namespace std;void file_it(os原创 2017-12-11 23:35:22 · 1447 阅读 · 0 评论 -
cpp: 学生成绩排序,计算平均分
不得不说,c++比起c便捷了很多,配上强大的IDE -> CLion更是如虎添翼。下面是一个简单是统计几个学生成绩的小案例。如果使用java这样的纯面向对象的语言,非常简单;如果使用c就比较麻烦了,需要去处理字符串,结构这些东西;如果是c++呢?相对来说,还是比较简单。当然,这是一个简单的案例,没有涉及到函数的传参。#include <iostream>using namespace std;s原创 2017-11-26 13:16:42 · 4609 阅读 · 0 评论 -
c 指针与数组陷阱
#include <stdio.h>#define SIZE 5int main(void) { char *strings[SIZE]; char (*str)[SIZE]; printf("size of str = %zd, size of strings = %zd\n", sizeof(str), sizeof(stri...原创 2019-05-16 01:00:15 · 224 阅读 · 0 评论 -
c 如何定义与使用字符串数组[字符串数组作为实参以及形参的表示]
c 里面字符串其实是字符数组。不过,只是知道这个还是很难精确表述字符串以及字符串数组。一般形式的操作是这样子的: char arr[ROW][LENGTH]; char *ptr[ROW]; for (int i = 0; i < ROW; ++i) { ptr[i] = arr[i]; }从理论上讲,char arr[row][col] 与...原创 2019-05-19 22:15:39 · 12643 阅读 · 0 评论 -
c 字符输入与验证,毁人不倦
蛤蛤蛤铪蛤铪蛤。文章目录蛤蛤蛤铪蛤铪蛤。为了刚好的认识 `scanf()`,`getchar()`,输入行缓冲之间的坑。当然,主要是为了装逼。运行效果如下:为了刚好的认识 scanf(),getchar(),输入行缓冲之间的坑。我决定写一个练习题。当然,主要是为了装逼。编写一个提供加减乘除的菜单选择程序。提供交互与输出。。。。(原题太长,来源不可考,直接给出源码。代码本身很简单。主要...原创 2019-04-27 18:16:06 · 274 阅读 · 0 评论 -
c 对清除输入剩余字符 为什么是 【while( ( ch = getchar()) != '\n') 】的问题解释
对于行缓冲输入,只有读到换行符才会调用 getchar()函数。但是,’\n’明显也是一个字符。那为什么while ( (ch = getchar()) !='\n' ) ...这样做有效?很简单,最后一次的字符是'\n', 导致循环的条件不满足,退出循环了。但是这时候,ch = getchar() 已经执行了,也就是说,最后一个字符'\n'也被读到了。那么,这一行的剩余部分都读掉了...原创 2019-04-27 15:56:00 · 3797 阅读 · 0 评论 -
cpp: 使用类模板以及链表实现队列Queue
在学习模板方法的时候,我刚好在看数据结构。想着能不能通过模板方法实现一个通用的queue & stack & list呢?当时尝试了,但是失败了。因为当时不知道这需要使用到类模板。 ps: 如果不是基于oop去实现的,模板方法肯定是够用的;但是既然是cpp代码,我还是倾向于使用oop的思想去实现。毕竟相对更容易处理,而且代码也更清晰。现在,贴一下我的代码,以作纪念。 ps:关于通过链表实现原创 2018-01-19 23:38:01 · 1646 阅读 · 2 评论 -
cpp: 使用链表实现queue 模型
queue 是一个典型的容器,FILO类型的。队尾增,队头删。下面是简单实现://// Created by cat on 2018/1/6.//#ifndef CPP02_QUEUE_H#define CPP02_QUEUE_H#include "Customer.h"namespace que { typedef Customer Item; class Queue {原创 2018-01-07 00:54:56 · 565 阅读 · 0 评论 -
cpp: 自定义class中内存管理示例
通过自定义一个String类来表示内存管理在自定义类中需要处理的地方。//// Created by cat on 2018/1/2.//#ifndef CPP02_STRINGBAD_H#define CPP02_STRINGBAD_Hclass StringBad {private: char *str; unsigned int len; static int原创 2018-01-03 01:07:13 · 406 阅读 · 0 评论 -
cpp: 随机漫步者的位移与步数的关系模型实现
关于随机漫步的介绍参见:随机漫步理论通过cpp实现随机漫步的关系模型。(计算移动目标位移需要随机漫步多少步)通过实践才能知道自己的不足,仅仅是看书难免会感觉生疏。下面是实现: 一共3个文件,分别是Vector.h–> 矢量类定义,Vector.cpp–>矢量类的具体实现,main.cpp–>随机漫步模型的具体实现。//// Created by cat on 2018/1/1.//#ifnd原创 2018-01-01 21:15:53 · 477 阅读 · 0 评论 -
cpp: 读取字符串的最简便方式
利用string可以非常方便的读取字符串,而不必考虑字符数组大小,以及什么时候需要丢弃多余缓冲的问题了。std::string str;std::getline(std::cin,str);原创 2017-12-17 23:49:33 · 1786 阅读 · 0 评论 -
cpp: 读取输入中的多个数字
cpp 中,如何读取一行中的前两个数字,并且丢弃后面的内容?#include<stdio.h>#include <iostream>double adjustSum(int, int);using namespace std;int main(void) { int m, n; cout << "# input two numbers n,m (0 to quit):";原创 2017-12-07 21:35:21 · 1862 阅读 · 0 评论 -
c: 统计文章的单词数量
不多赘言。#include <stdio.h>#include <ctype.h>int main(int argc, char const *argv[]){ char ch,prev='\n'; int startWord = 0; int wordlen=0; // 单个单词长度 int wordcount=0; // 总单词数量 int total原创 2017-11-19 11:04:24 · 1672 阅读 · 0 评论 -
c:文本文件的读写(simple版)
c 语言给我的感觉一直是一个黑框框,除了打印一些文本字符,输入一些字符之外,似乎没有了别的用处。 今天刚好学到一个装逼的本事,可以通过简单的读写字符的程序,实现文本文件的读写。代码很简单(stdincc.c):#include <stdio.h>int main(int argc, char const *argv[]){ char ch; while ( (ch = getch原创 2017-11-13 22:55:07 · 378 阅读 · 0 评论 -
c: scanf 与 getchar
如你所知scanf可以接收格式化输入,可以接收数字,字符,甚至是字符串;而getchar只能获取单个字符。而且,有一个很重要的点就是:如果使用scanf去接收不对应的输入:接收会失败,但是输入的数据并没有丢失。 getchar()没有这方面的问题,因为任何输入都可以理解成字符,除了EOF。那么,这样子就可以做一些有趣的事情了。比如检测输入的有效性;比如一直等待有效输入。下面有一个简单的程序,就用到原创 2017-11-17 22:41:33 · 385 阅读 · 0 评论 -
c 给字符串赋值
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(void){ char* aa = "hello world"; char* bb = (char*)malloc(strlen(aa)+1); char* ta = aa; char* tb = bb; while(*bb+原创 2017-03-26 20:45:38 · 4283 阅读 · 0 评论 -
C 超级难搞定的 删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。 提示:输入数据的设计使得不可能出现输出为空的情况。#include <stdio.h>#include <string.h>#include <stdlib.h>/** 输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,* 即结果字符串中不能包含S2。* 提示:输入数据的设计原创 2017-03-26 18:00:26 · 6516 阅读 · 0 评论 -
c 通过指针表达运算结果
在Java或Python中,如果一个函数/方法,得不到预期结果,我们可以通过抛异常的方式通知调用者,程序并不能得到预期结果。但是在C中,无法通过这种方式告知调用者。一般情况下,我们可以通过返回一个不可能的值告知计算失败。但是,在特殊情况下,比如,任何结果都有可能是预期值,这时候,就无法通过返回值告知调用者函数出异常了。那么,这时候该怎么办?难道C遇到这种情况就无法处理了吗?非也,C有其特殊的方式,原创 2017-03-25 14:44:01 · 526 阅读 · 0 评论 -
c 获取数组最大值和最小值
#include <stdio.h>// 获取数组元素的最大值和最小值int main(void){ int arr[] = {1,2,3,5,67,8,9,33}; int min,max; compute_m(arr,sizeof(arr)/sizeof(int),&min,&max); printf("result: min = %d , max = %d \n原创 2017-03-25 14:19:43 · 7645 阅读 · 1 评论