
C/C++
文章平均质量分 65
Donald Su
公众号:"Donald Su",微:sug2010
展开
-
C++获取文件名(去除后缀)的方法
文章目录1、strtok函数 -- C string函数使用strtok获取文件名strtok函数相关说明2、string相关函数 -- C++ STL 函数关于string中 find_last_of 和 rfind的比较参考:编码中有可能会遇到给定的是含文件后缀的文件全名,如果只展示、输出文件名,需要进行一些处理。以下说的c string函数需要 #include <cstring>;C++ STL string需要 #include <string>1、strtok原创 2021-08-23 23:39:25 · 7426 阅读 · 0 评论 -
结合CSAPP两个习题说明mmap使用方法
从【man mmap】中可以看到该函数的定义。习题9.14:从文件中读取,然后写入。#include <iostream>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>using namespace std; int main(int argc, char* argv[]){ int fd = open(argv[1], O_RDWR); // s原创 2021-07-05 21:49:25 · 827 阅读 · 0 评论 -
【整理完善】vector的erase和remove的区别
首先,vector中并没有remove成员方法,这里说的remove是STL算法中的remove函数vector的erase和remove的区别知道erase,以及存在的问题,会导致迭代器失效⁉️但remove原理真的忘记了,不知道查找了下,remove是std中的算法,vector中没有该方法,两个区别挺大的,因为remove只是移动,并不删除具体,看一下remove的实现就明白了:https://www.cplusplus.com/reference/algorithm/remove/S原创 2021-07-01 23:57:06 · 1419 阅读 · 0 评论 -
UTF-8转换为GBK编码
直接进行转码std::string zmq_client::Utf8ToGbk(const char *src_str){ int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0); wchar_t* wszGBK = new wchar_t[len + 1]; memset(wszGBK, 0, len * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK原创 2020-12-21 17:13:15 · 4483 阅读 · 0 评论 -
【待完善】一个面试题-- int a = ‘(int)(((int *)0)+4) ’的值是多少?
int a = (int)(((int *)0)+4); 的值是多少?You can get 16, but you can also get a crash.自己算出来是 4,但是值不对,给定的是16,没看清楚是咋回事,同时看到涉及到内存,说了会报错,但是没正面回答其值是多少。最后情况在自己的程序中进行验证,本地确实报错,都没能编译通过。验证了下,用gcc编译有warning(执行结果为 16),用g++是直接出错,不能通过。解释:将(int *)0把整数0强制转换为int *型执.原创 2020-10-17 15:05:15 · 830 阅读 · 0 评论 -
C++ 输入一行数字(未知个数),对其进行解析(string分割函数 split)
笔试中如果遇到这种,特别麻烦,有时候可能会被在一些细节处出问题,现总结如下。文章目录1、利用“cin + getchar()”2、利用“std::getline() + STL”3、通用代码(多种分隔符的情况)1、利用“cin + getchar()”输入一行,并以空格隔开,空格处理可以留给cin去除,getchar主要判断是否换行(输入结束),代码如下:vector<int> vecint num;while (cin >> num){ vec.push_.原创 2020-10-14 22:49:59 · 5360 阅读 · 0 评论 -
MacOS Catalina下使用gdb进行调试遇到的几个问题
相关版本MacOS版本:10.15.3GNU gdb (GDB) 9.1issue-1:run之后停止进入gdb,打好断点,运行,运行起来后,有如下日志,Starting program: /Users/franzkemmerich/work/42_school/test/a.out[New Thread 0xd03 of process 1661]之后不能继续执行,只能通过ctr+z让该程序在后台运行,之后使用kill命令杀掉该进程。然后再次进入,有可能就运行正常了。问题和 【(gd原创 2020-06-13 22:42:40 · 2096 阅读 · 0 评论 -
通过GDB分析字符串不能修改的原因
在学习C、C++的过程中,或多或少多接触过:字符串内容不能修改。一般告知的原因是字符串存放在字符常量区,字符常量区的内容不能修改。细心的同学会发现,如果一个字符串数组中存放的数据也是放在字符常量区的,为什么数组的内容可以修改?基于这个问题,写出了如下测试代码。#include <iostream>using namespace std;int main(){ char *p = "hello world"; char str[] = "doanld";原创 2020-06-11 22:29:45 · 719 阅读 · 0 评论 -
通过GDB调试理解指针
最近在复习C++相关内容,对指针始终理解不到位,对指针间的数据还是持有怀疑太多,所以借助GDB进行调试,以加深自己对指针的理解。源代码:#include <iostream>int main(){ int a = 10; int* pon = &a; //pon是一个int型,其值为 a的地址,即 pon == &a printf("pon = %X, *pon = %d, &a = %X, &pon = %X\n", p原创 2020-06-06 20:11:34 · 848 阅读 · 0 评论 -
不用sqrt()函数,求平方根的三种方法
最近看到了这个比较有意思的题目,探究了一下。文章目录1、二分法2、牛顿法3、来自于Quake III源码的解法4、完整代码参考当然有最暴力的方法,直接遍历,(0.0, x)区间内所有的数据(也可以是 x/2),看值是否相等,但该方法太过暴力,在此不讨论。可以采用下面的 二分法、牛顿法,Quake III源码中的方法。浮点数的比较方法比较特别,不能使用平常的 x == 0的方法进行比较,下面都用到了equal比较方法,equal的代码:const double Min_value = 1e-7;.原创 2020-05-25 20:22:29 · 5639 阅读 · 0 评论 -
利用条件编译预处理命令高效注释C/C++代码
大段注释代码比较麻烦,本文介绍如何利用条件编译预处理命令高效注释C/C++代码。注释代码,使用下面语句即可实现代码的大段注释,如果需要继续使用这些代码,将#if 0 改为 #if 1 即可实现。#if 0...#endif另一种处理方法,自己这几次的代码都放在一个文件中,如果采用注释的方式,需要先加很多注释,后续才能知道对应的代码,将会非常麻烦。经过几次迭代,终于进化出以下语句,后面只...原创 2019-10-04 17:23:52 · 1014 阅读 · 0 评论