我从来不觉得写代码只是写代码的事,也不是整天拿数据结构和算法来研究,拿C、C++大头书来看。我对自己的要求是:坚持融会贯通,坚持多层次联系,坚持学习,坚持积累。

非代码知识

主要关于linux日常使用的。

1、将man转换成pdf,如

$ man -t open | ps2pdf - open.pdf

(看似有空格的地方,实际上就是有空格)

注意,像write这个函数,需要在-t 后加2,以表示它是系统函数。

2、objdump反汇编,如果编译使用-g选项,可以用-dS选项:

$ objdump -dS a.out > aa.txt

3、hexdump可查看很多种格式的文件,如二进制:

$ hexdump -C a.out

显示结果有3列,依次为偏移、十六进制数据,可读(可打印)字符。这与用UE打开二进制文件效果一样。

4、在代码前面添加行号:

$ awk '{printf("%02d: %s/n", FNR, $0)}' < foo.c > bar.c

5、shell操作

近来经常用SecureCRT操作linux,有时不太喜欢用光标那几个键移动,经常使用组合键,由于花了一定时间学习emacs(约一年前开始接触,断断续续用不少时间)。下面总结一下自己在shell(bash)中常用的快捷键,对emacs熟的人应该很清楚了,最英文比较敏感的也应该意会到每个单词约表示什么意思。

C+a:移到命令开始处
C+e:移到命令结尾
C+f C+b:向前、向后移一个字符
M+f M+b:向前、向后移一个单词
可用比较长的命令行感受一下这些命令的便捷,最经典的,假如配置qtopia2时有前面某个地方写错了,除了使用光标移到前面外,可以使用M+b向后移,更可以使用C+a直接移到开头。

C+p C+n:前一历史命令、后一历史命令
C+k:删除光标至行尾所有字符。——称之为剪切更恰当
C+w:似乎与C+k一样
C+y:粘贴
C+l:清屏,与clear命令作用相同
C+u:删除整行,可用C+y粘贴
……其它的

除了emacs、bash外,在u-boot命令行中也有类似的。可研究一下readline这个库。

代码点滴

1、获取系统信息:

#include <stdlib.h>
#include <stdio.h>
#include <sys/utsname.h> /* uname */

int main(void)
{
 struct utsname name;
 uname(&name);
 printf("%s/n%s/n%s/n%s/n%s/n", name.sysname, name.nodename,name.release, name.version, name.machine);

return 0;
}

运行结果:

$ ./a.out         
Linux
FightNow
2.6.27.25-78.2.56.fc9.i686
#1 SMP Thu Jun 18 12:47:50 EDT 2009
i686

它与uname -a作用一样。

2、函数指针测试:

/*****************************************************************
函数指针测试
$ ./a.out
in func:sig1, num:100
in func:foobar 100 200
in func:sig2, num:250
in func:foobar 300 400
in ts_input_read()
read me
2011-4
*****************************************************************/
#include <stdio.h>
/*函数指针*/
/* 这两种有何区别? */
typedef int boot_fn(int a, int b);
typedef int (*boot_fn_p)(int a, int b);

int foobar(int a, int b)
{
 printf("in func:%s ", "foobar");
 printf("%d %d/n", a, b);
 return 0;
}

void sig1(int num, boot_fn handle)
{
 printf("in func:%s, num:%d/n", "sig1", num);
 handle(100,200);
 //printf("%p %p/n", handle, &handle);
}

void sig2(int num, boot_fn_p handle)
{
 printf("in func:%s, num:%d/n", "sig2", num);
 handle(300,400);
 //printf("%p %p/n", handle, &handle);
}

/*结构体中的函数指针*/
struct tslib_ops {
 int (*read)(char *inf, int nr);
 int (*fini)(char *inf);
};

struct tslib_module {
 void *handle;
 const struct tslib_ops *ops;
};

static int ts_input_read(char *inf, int nr)
{
 printf("in ts_input_read()/n");
 printf("%s/n", inf);
 return 0;
}

static int ts_input_fini(char *inf)
{
 printf("int ts_input_fini()/n");
 return 0;
}

static const struct tslib_ops input_ops = {
 .read = ts_input_read,
 .fini = ts_input_fini,
};

struct tslib_module module;

int main(void)
{
 sig1(100, foobar);
 sig2(250, foobar);
 module.ops = &input_ops;
 module.ops->read("read me", 11);
 return 0;
}

上面代码中使用了稍微修改后的tslib中的一些代码。

3、论“断言”

网上很多笔试题都喜欢用断言,经典者莫如strcpy等等函数的实现,如无断言,则说明应试者没有具备基本的出错处理能力云云。见那么多人喜欢断言,于是用gcc和vc测试了一下。

在gcc下故意造一错误,用断言判断之:

#include <assert.h>

int main(void)
{
 int f = 250;
 
 assert(f!=250);
 return 0;
}

编译无警告,运行出错,如下:

a.out: test.c:7: main: Assertion `f!=250' failed.
已放弃

说明断言生效了。

同样代码,在vc6.0下测试,除了弹出Debug Error!对话框外,dos窗口还出现:

Assertion failed: c!=250, file E:/Late Lee/c-test/test/main.c, line 367

后果非常严重:程序退出运行,而其它信息与操作系统有关。

不过,说实话,我很少用到断言。出错信息的处理每个人都不相同,但是原则都是尽可能地友好、人性化。比如,调用malloc需要判断返回值,不过我没有使用assert,只是简单打印出错信息,返回负数。

有人问我为什么要判断malloc的返回值,我回答不上来。在调用系统调用时我也判断返回值,不为什么,只是对自己写的程序负责,为了方便调试、日后管理。

但是,跟人讨论技术时,时刻将技术名词挂载嘴边,会显得自己更有水平(xx设计模式、xx算法、xx架构,等等)。至于如何交流、如何忽悠人,就仁者见仁了。

说到笔试,很多资料都有这么一题:

写一strcpy函数,让面试者说。

说什么?说参数有没有const,使用了assert没有,返回值有没有?注意不注意结束符。并写一个标准的strcpy。

其实我也想出一笔试题:

求sizeof(int)。

如果面试者直接说4,说明它在32位平台上写过程序。

如果他问面试官这题目的环境、平台,说明他注意到了不同平台会有不同结果。

如果他继续讨论单片机、ARM、x86甚至MIPS平台,说明他有一定的硬件功底;

如果他再讨论了计算机的组成及结构,冯·诺依曼体系,讲述了当初计算机的发展,说明他在计算机领域已经有一定水平。

如果再讨论到计算机科学的方方面面,并展示自己写的操作系统、编译器及科学研究成果,那么他不用面试了,可以去拿计算机领域里的大奖了。

4、

char ch = "Fuck the world!"[2];

实际上ch为字符“c”,即字符串第2个字符(从0算起)。与那个得过奖的unix程序本质一致。参见:

linux下CPP的认识

其它未记录的还有一些。

李迟2011年4月知识积累相关推荐

  1. 李迟2011年3月代码积累

    上个月积累的代码如下,由于在同一文件中测试多个代码段,因此只好用#if 0 --#endif的形式来控制了.这次的代码包括: 1.测试函数入栈顺序,入栈顺序依据语言的不同而不同,C语言是从右到左的.从 ...

  2. 李迟2022年1月知识总结

    本文为 2022 年 1 月知识总结. 研发编码 Golang golang中中文字符长度为3,如下示例中,判断某字段中文开头是否为"广西"二字,如是则舍去,只保留后面的字符串,如 ...

  3. 李迟2021年12月知识总结

    本文为 2021 年 12 月知识总结. 研发编码 测试发现,不同语言对浮点数的存储和处理不太相同,比如1.5,有的语言存储的可能是1.49999999999,有的可能是1.500000001.这样四 ...

  4. 李迟2021年11月知识总结

    本文为 2021 年 11 月知识总结. 研发编码 C / C++ 无. golang 保留小数点后2位,假定在原数值基础上上浮10%(即1.1倍),但不进位. // 使用Sprintf有些情况会导致 ...

  5. 李迟2021年10月知识总结

    本文为 2021 年 10 月知识总结. 研发编码 C / C++ 无. golang 写了数字签名.数字信封的测试示例,了解了 RSA .AES 加解密,知道 AES 的密钥长度必须大于16字节. ...

  6. 李迟2021年8月知识总结

    本文为 2021 年 8 月知识总结. 编码总结 C / C++ 产生随机数示例二则. 产生给出范围,并指定数量的随机数.即给定数组(实为向量),其内可预先定义有数值,也可以为空,产生随机数时,需保留 ...

  7. 李迟2021年6月知识总结

    本文为 2021 年 6 月知识总结. 编码总结 C / C++ 使用sscanf检查不确定的输入参数: char name[8] = {0};int type = 0;int threadnum = ...

  8. 李迟2022年2月知识总结

    本文为 2022 年 2 月知识总结. 研发编码 Golang Linux linux 系统可用 nc 命令来模拟 Socket 服务端和客户端.已在工作中应用到. 在后台执行valgrind时,可用 ...

  9. 李迟2021年9月知识总结

    本文为 2021 年 9 月知识总结. 研发编码 C / C++ 无. golang 跟时间转换有关的几个片段: exTime := "20210901"mytime, _ := ...

最新文章

  1. 零基础入门学习Python(29)pickle模块
  2. 【Python-ML】SKlearn库L1正则化特征选择
  3. hbase系统架构图以及各部分的功能作用,物理存储,HBase寻址机制,读写过程,Regin管理,Master工作机制
  4. 华水c语言课程设计,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
  5. python table对象_(RPA学习):Python-docx 常用方法
  6. mysql 8.0配置主从同步_MySQL 8.0 主从同步
  7. java基于springboot的酒店预约管理平台系统
  8. 5s管理清洁活动如何推行?
  9. 0704函数的递归调用
  10. html5 canvas 在线图片转换器
  11. shiro集成springboot的脚手架
  12. python参数化3d_3D参数化建模器freecad中文版
  13. python教程68--cufflinks库绘图功能
  14. 破解微信图片防盗链 微信图片不显示怎么办?
  15. 梦想世界 2014年8月14日服务器维护公告,《命运之轮》停止运营公告
  16. 百度al的人体检测接口调用
  17. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析
  18. DES加密与解密代码
  19. S32DS 3.4 3.5颜色配色方案及代码自动补全提示
  20. 对云端软件平台的印象

热门文章

  1. 京东方明年iPhone OLED面板供应量是今年3倍 份额占比约为20%
  2. 蔚来三元铁锂电池绕道超车
  3. 三星Galaxy S21纪念版开启预售:“海洋蓝”配色+金色中框
  4. 缺货警告!小米这款手机已被骂惨...
  5. 苏宁易购第二次债券购回基本方案:购回资金总额20亿元
  6. TFBOYS网易云音乐演唱会破纪录 同时在线人数超78万
  7. 余承东谈华为6G:正在研发,还需要10年时间
  8. 任正非:华为欲出售5G技术制造竞争对手
  9. 荣耀推出MOSCHINO联名款荣耀20 PRO手机 售价3799元
  10. 华为nova 5全新外观曝光:水滴全面屏设计 边框下巴极窄