
C/C++
文章平均质量分 70
五道口纳什
wx公众号/B站:五道口纳什
展开
-
C/C++ 安全编码 —— 指针与内存
1. 仿踩内存if (buf[len - 1] != 0x5A) { return;}原创 2018-02-02 21:53:05 · 1121 阅读 · 0 评论 -
数组(数组名)与指针辨异
int arr[] = { 1, 2, 3 };printf("arr = %p\n", arr);printf("&arr = %p\n", &arr);printf("sizeof(arr) = %d\n", sizeof(arr));printf("arr+1 = %p\n", arr + 1);printf("&arr+1 = %p\n", &arr +原创 2018-01-24 22:05:27 · 741 阅读 · 0 评论 -
C/C++ 安全编码 —— 不安全的函数
1. 文件与IO操作gets():从控制台输入到字符数组;char response[8];gets(response);如果控制台输入超过 8 个字符,程序便会发生不确定的行为;原创 2017-12-26 23:47:13 · 2321 阅读 · 1 评论 -
C 非标准库(conio.h)
所谓的 C 标准库(C standard library),是指在 ISO C 或者 POSIX 标准中定义的; POSIX is a superset(超集) of the standard C library, and it’s important to note that it defers to it. If C and POSIX is ever in conflict, C wins.原创 2017-07-29 20:17:55 · 4903 阅读 · 0 评论 -
C 语言 —— ! 和 ~(感叹号和波浪号)
~ 表示按位取反,是位运算符,运算对象是 2 进制。!表示逻辑非,是逻辑运算符,运算对象是真或假。最终的结果也是 0/1 !!:则表示取过一次非之后,再取一次;原创 2016-09-22 08:50:20 · 21791 阅读 · 0 评论 -
强大的 function adapters
- 容器是以 class templates 完成;- 算法以 **function** templates 完成;- 仿函数是一种将 operator() 重载的 class templates;- 迭代器则是一种将 operator++ 和 operator* 等指针习惯行为重载的 class template原创 2016-09-21 23:14:40 · 924 阅读 · 0 评论 -
transform、accumulate —— C++ 下的 MapReduce
accumulate:Map,逐元素分别单独处理; 注:for_each:不改变区间元素的内容,所以更多的是输出打印等功能;accumulate:Reduce,整体化归为一个单独的数值;两个函数均位于<algorithm>头文件中。原创 2016-09-21 22:43:31 · 1544 阅读 · 1 评论 -
C 语言常见 API(fprintf、fputs、fprintf)
1. fprintf:输出到文件描述符对应的文件stderr:错误输出也是一种特殊的文件描述符原创 2016-09-21 09:11:43 · 4313 阅读 · 0 评论 -
CRT(C Runtime Library)—— C/C++运行时库
C runtime library(part of the C standard library)任何一个 C 程序,它的背后都有一套庞大的代码来进行支撑,使得该程序得以运行在更高级别上,而不必担心同计算机底层操作的细节,这套代码至少包括:入口函数(Linux,_start)入口函数所依赖的函数构成的函数集合(平台系统相关);各种标准库函数的实现;这样的一套代码即称为运...原创 2016-09-17 22:27:40 · 2466 阅读 · 0 评论 -
#ifdef 的使用
1. DEBUG、_DEBUG原创 2016-09-17 21:20:29 · 3052 阅读 · 0 评论 -
指针应用时的注意事项
1. 空指针不可取其值或者继续访问;原创 2016-09-16 22:33:23 · 1060 阅读 · 0 评论 -
【奇葩笔试】—— printf() 作为函数的参数及其返回值
考察 printf() 作为函数的参数,以及其返回值情况原创 2016-09-11 19:40:52 · 1513 阅读 · 0 评论 -
【Debug】— C++ 表达式必须包含类类型
错误一般发生在使用.进行访问时,原因可能在于:你以为你定义了一个类对象,其实你是声明了一个函数,在编译器看来;对类对象指针采用.的方式访问其成员变量;1. 情况 1class Test{public: Test(){ } void foo(){ }};int main(int, char**){ Test t(); // 编译器会将 t原创 2016-09-11 12:20:58 · 80095 阅读 · 2 评论 -
C++ Tricks(一)—— 判断字符串 string 对象的所有字符都相等
S == string(S.size(), S[0]);原创 2016-09-09 10:40:32 · 1763 阅读 · 0 评论 -
C Tricks(十九)—— 求以任意数为底的对数
本文仅求对数的整数部分:int log(int n, int base){ int i = 1, cnt = 0; while (i*base < n){ i *= base; ++cnt; } return cnt;}原创 2016-09-06 12:13:34 · 1493 阅读 · 0 评论 -
C Tricks(十八)—— 整数绝对值的实现
为正还是为负;(对 int 类型而言,第一位为符号位,其余为数值,则右移 31 位,再与 1 求与) 如果为正 ⇒ 返回原值如果为负 ⇒ 对其二进制形式各位取反 + 1int abs(int x){ return x >> 31 & 0x01 ? ~x + 1 : x;}原创 2016-09-03 18:33:10 · 1062 阅读 · 0 评论 -
C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历
使用 if + continue 实现对对角线元素的屏蔽for u in range(n): for v in range(n): if u == v: continue ...原创 2016-08-18 18:39:14 · 1366 阅读 · 0 评论 -
C Tricks(十六)—— 复制字符串
while (*s++ = *t++); // target ⇒ source //原创 2016-08-17 16:29:43 · 863 阅读 · 0 评论 -
C Tricks(十五)—— 算符优先级的表示
不能简单地按照“先左后右”的次序执行表达式中的运算符。关于运算符执行次序的规则(即运算优先级),一部分取决于事先约定的惯例(比如乘除优先于加减),另一部分则取决于括号也就是说,近根据表达式的某一前缀,并不能完全确定其中各运算符可否执行以及执行的顺序,只有在获得足够多后续信息之后,才能确定其中哪些运算符可以执行。原创 2016-06-27 16:27:18 · 1949 阅读 · 0 评论 -
switch 关键字的学习
1. 多 case 匹配bool paren(const char exp[], int lo, int hi){ stack<char> S; for (int i = lo; i <= hi; ++i){ case '(': case '[': case '{': S.push(exp[i]); break; case ')': if (S.emp原创 2016-06-27 15:40:34 · 1312 阅读 · 0 评论 -
C Tricks(十四)—— 余数
正整数 a,ba,b,计算 aa 关于 bb 的余数:a - a/b*b;进一步我们也可获得距离 aa 最近的能被 bb 整除的整数分别是:a/b*ba/b*b+baa 正是介于二者之间。原创 2016-06-16 20:54:11 · 1109 阅读 · 0 评论 -
C/C++ debug(四)
C/C++ debug(一) C/C++ debug(二) C/C++ debug(三) 1. 字符数组的最后一个元素最后一个有意义的元素。const char buf[] = "hello";sizeof(buf)-1 ⇒ 表示最后一个元素,也即`\0`sizeof(buf)-2 ⇒ 有意义的最后一个元素,也即`o`原创 2016-06-15 11:16:05 · 1269 阅读 · 0 评论 -
C Tricks(十三)—— trim 的实现
trim:修改;trim 函数一般删除(所谓删除其实是限制区域)字符串两端的某一字符:void trim(const char exp[], int& lo, int& hi, char c = ' '){ while (lo <= hi && exp[lo] == c) ++lo; while (lo <= hi && exp[hi] == c) --hi;}当然这样写也过于死原创 2016-06-14 18:34:59 · 972 阅读 · 0 评论 -
理解 static 关键字
static函数与普通函数 1. 具有 static 局部变量的函数具有 static 局部变量的函数,让函数有了状态,让函数有了时态(时间的概念)。原创 2016-06-07 12:03:33 · 1132 阅读 · 0 评论 -
趣学 C 语言(十三)—— 标准输入输出重定向
在 C 语言中,可以使用 freopen 将输入输出重定向。C语言的标准输入输出为 stdin 和 stdout,这两个变量的类型为FILE*类型,也就是说,标准输入输出操作,其本质还是文件操作,只不过处理的对象是特殊的文件 —— 控制台。当需要重定向时,可以调用:#include <stdio.h>stdin = freopen("data.in","r",stdin);stdout = fr原创 2016-06-06 21:03:31 · 1141 阅读 · 0 评论 -
C 程序的存储空间布局
1. 存储空间布局static int g_init = 1; // data 段static int g_uninit; // bss 段int main() { static int s_init = 1; // data 段 stat原创 2016-06-06 11:41:41 · 1009 阅读 · 0 评论 -
C Tricks(十二)—— 获取字符数组的末尾元素
使用 strlen(buf)-1,自然不能使用 sizeof。#define MAXLINE 4096char buf[MAXLINE];while (fgets(buf, MAXLINE, stdin) != NULL){ if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0; ...}原创 2016-06-03 16:22:35 · 1312 阅读 · 0 评论 -
自加作为循环的执行条件时的注意事项
while (i<5)while (i++<5)while (++i<5)\begin{array}{l}\text{while }(i<5)\\\text{while }(i++ < 5)\\\text{while }(++i < 5)\end{array}int i = 0;while (i < 5) ++i;cout << i << endl; // 5i =原创 2016-06-01 22:11:44 · 1106 阅读 · 0 评论 -
C/C++ 控制台输入
1. 循环获取成对整数int a, b;while (scanf("%d %d", &a, &b) != EOF){ ...}while 循环的退出,对于:(1)windows 系统:ctrl + z(2)Linux 系统:ctrl + dEOF:end of file# define EOF (-1)2. getline:循环逐行读取(保存为字符串)#include <iostr原创 2016-06-01 09:36:35 · 6116 阅读 · 0 评论 -
C Tricks(十一)—— 排除一个二维数组的边界
排除一个二维数组的边界,通常此时的二维数组表示的是图像矩阵,并对其进行分块处理的情形。int mat[480][640]for (int y = 2; y < 480 - 2; ++y){ for (int x = 2; x < 640 - 2; ++x){ mat[y-2]、 mat[y-1]、 mat[y]、 mat[y+1]、 mat[y+2] mat原创 2016-05-31 16:17:40 · 1428 阅读 · 0 评论 -
C Tricks(十)—— str2int vs int2str
str2int:’9’-‘0’int2str:’0’ + 9(48 + 9)原创 2016-05-29 18:01:37 · 1418 阅读 · 0 评论 -
C Tricks(九)—— 获取文件大小与申请数组空间
获取文件长度FILE *fp = fopen("...", "r");fseek(fp, 0, SEEK_END);int len = ftell(fp);申请数组空间以下的做法显然是可行的:char ch[len + 1];可行的解决方案是:char *pStr;pStr = new char[len + 1];rewind(fp); //原创 2016-05-29 13:21:38 · 1043 阅读 · 0 评论 -
趣学 C 语言(十二)—— 文件操作
FILE 结构体#ifndef _FILE_DEFINEDstruct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz;原创 2016-05-29 12:49:48 · 1079 阅读 · 0 评论 -
C Tricks(八)—— 硬币和骰子的模拟
所谓硬币:0/1 所谓骰子:0/1/2/3/4/5int coin(){ return rand()%2;}int dice(){ return rand()%6;}原创 2016-05-28 20:27:37 · 1845 阅读 · 0 评论 -
斐波那契数列(面向对象版)
class Fib{private: int f, g;public: Fib(int n){ f = 1; g = 0; while (g < n) next(); } int get() { return g;} int next(){ g += f; f = g -原创 2016-05-27 20:13:01 · 1640 阅读 · 1 评论 -
C Tricks(七)—— 有序向量的去重
有序向量的去重,仅需借助指定位置的删除 remove(r) 这一辅助函数即可:int uniquify(int A[]){ int oldSize = size; int i = 1; while (i < size){ A[i-1] == A[i] ? remove(A, i) : ++i; } return oldSize - size;原创 2016-05-27 12:27:45 · 1295 阅读 · 0 评论 -
C Tricks(六) —— 数组去重的实现
无序数组去重的实现,需要借助,区间元素的查找(find(e, lo, hi)),指定位置的删除(remove(r))。int size = 10; // 全局变量,指示数组的长度// 区间的查找int find(int A[], int x, int lo, int hi){ while (--hi >= lo && x != A[hi]); return hi;}//原创 2016-05-27 11:07:57 · 1196 阅读 · 0 评论 -
C Tricks(五)—— 比例和阈值的实现
a、b 两个整型(已知 a≤ba\leq b),在进行一些阈值化的处理之前,常需进行阈值的判断,比如:a 大于 b 的一半: if (a << 1 > b) == 2a > ba 小于 b 的25%: if(a << 2 < b) == 4a < b\begin{split}&\text{a 大于 b 的一半: if (a << 1 > b) == 2a > b} \\&\text{a原创 2016-05-27 10:08:04 · 1314 阅读 · 0 评论 -
C Tricks(四)—— 从数组中随机选择一个元素
arr[rand() % n];rand() % n:等概率地获取,0 ~ n-1 中的任一元素。原创 2016-05-26 20:29:40 · 5773 阅读 · 0 评论 -
C++ 面向对象 —— 实用程序片段
1. 重载 [] 运算符template<typename T>T& Vector<T>::operator [](int r) const { return _elem[r];}经重载后的操作符[]返回的是对数组元素的引用,意味着它既可以取代get()操作(通常作为赋值表达式的右值),也可以取代set()操作(通常作为左值)。原创 2016-05-26 17:19:12 · 1066 阅读 · 0 评论