其实自己也是可以编写一个头文件的 通常都是在代码里重复多次的代码段,我们就把它编程头文件里,需要的时候直接用就好了 而在编写头文件时为防止重复定义,我们使用条件编译 下面这段代码意思就是如果没有定义MAX_H那么定义它并编译下面代码部分 头文件写好用.h扩展名保存 #ifndef _MAX_H #define _MAX_H int max( int a,int b ) { if( a > b ) return a; else return b; } #endif #include<stdio.h> #include"max.h" int main() { int a=5,b=9,t; t=max( a,b ); printf( "%d\n",t); return 0; } #include< > #include" " 的区别:尖括号编译程序会先到标准函数库中找文件 ;而引号编译程序会先从当前目录中找文件 比如上面个例子,使用尖括号就不会编译 继续阅读 >>


吕子健 17/07/24 14:23:21
今天做了一道单词逆序输出,句子顺序不变的题,输入1olleh !dlrow 2m'I morf .udh3 I ekil .mca 输出1hello world! 2I'm from hdu.3 I like acm. 想到了一个新思路,不同于以前的创建新数组保存翻转过来的单词,而是检测到空格后,直接以字符的形式挨个输出前一个单词,再单独考虑最后一个单词的输出,这样比之简单许多 上代码: #include<stdio.h> #include<string.h> int main() { int len,i,j,k,m,l,t; char str[1005]; scanf("%d",&t); getchar(); while(t--) { fgets(str,1005,stdin); l=strlen(str); str[l-1]='\0'; 继续阅读 >>


吕子健 17/07/20 21:40:54
在小组展示课设后发现了一些自己没注意到的问题,记下来,以防在日后做聊天室项目时碰到了不会犯同样的错误 总结下来主要是一些思维漏洞和代码上的BUG 1.注册账号信息时老师学生使用了同一个文件夹,这样不能区分是老师还是学生,学生注册过后能以老师的身份登录 2.在登录错误时没有返回的功能 3.在主界面选择时要求输入int类型的选项,如果输入字符串之类会崩,要解决 作者:weixin_36888577 发表于2017/7/17 17:05:02 原文链接 阅读:6 评论:0 查看评论 继续阅读 >>


吕子健 17/07/17 17:05:02
刚接触Linux的初学者对于各种命令都不知道,而纯英文的man查询又是否让你很苦恼呢,快来安装一个中文版的man手册吧 只需要简单的三步: 1.终端输入sudo apt_get install manpages_zh 2.安装后修改配置文件sudo gedit/etc/manpath.config 3.将里面所有的/usr/share/man改为/usr/share/man/zh_CN 这样就可以拥有一个中文版的man手册了,快去试试吧 注:因为很久没有更新过,所以并不全是中文 作者:weixin_36888577 发表于2017/7/15 14:58:07 原文链接 阅读:1 评论:0 查看评论 继续阅读 >>


吕子健 17/07/15 14:58:07
最近在看LinuxC这本书时,经常在代码里看见perror这个函数,并且后跟:“错误代码存入errno中,详细错误代码请参考man手册。” 查过后做一下笔记 使用perror这个函数要包含<stdlib.h>这个头文件 perror的函数原型为`void perror(const char *s)` 这个函数会先输出你传给他的实参 s 所指的字符串,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的& 继续阅读 >>


吕子健 17/07/14 15:11:10
以前单纯以为结构体 共用体的内存大小只需要算出每个成员的内存大小求总和就是了,慢慢才知道并不是这样。 那么为什么会出现内存对齐呢, 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 那让我们来弄清楚他的对齐规则吧 例: struct s { doiuble a; int b; char c; float d; }; sizeof(struct s)是多少呢? 其实并不是简单的8+4+1+4=17,而是24。为什么呢? 这里最大的基本类型是double,为8字节,所以该结构体是以8字节对齐的,所以是24. union s { int a; char b[10]; }; 该 继续阅读 >>


吕子健 17/06/21 10:36:29
#include <termio.h> int getch(void) { struct termios tm, tm_old; int fd = 0, ch; if (tcgetattr(fd, &tm) < 0) {//保存现在的终端设置 return -1; } tm_old = tm; cfmakeraw(&tm);//更改终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理 if (tcsetattr(fd, TCSANOW, &tm) < 0) {//设置上更改之后的设置 return -1; } ch = getchar(); if (tcsetattr(fd, TCSANOW, &tm_old) < 0) {//更改设置为最初的样子 return -1; } return ch; } 总 继续阅读 >>


吕子健 17/06/18 20:43:03
今天犯了一个很低级的错误typedef定义链表的时候报错,我是这样定义的 typedef struct{       int a;       int b;       Test *next;   }Test;   错误的原因是 在声明next的时候Test还没有被定义,解决方法如下: struct test{      int a;      int b;      struct test *next;   };   typedef struct test Test;   或者 typedef struct test{      int a;      int b;      test * next;   } 继续阅读 >>


吕子健 17/05/30 10:43:25
插入排序: for(i=1;i<n;i++) { temp=a[i]; for(j=i-1;j>=0&&a[j]>temp;j--) a[j+1]=a[j]; a[j+1]=temp; } 冒泡排序 for(int i=0;i<n-1;i++)     for(int j=0;j<n;j++) { if(arr[j]<arr[j+1]) {  int t=arr[j];  arr[j]=arr[j+1];  arr[j+1]=t;    } 选择排序 for(int i=0;i<n-1;i++)     for(int j=i+1;j<n;j++) { if(arr[i]<arr[j]) {  int t=arr[i];  arr[i]=arr[j]; & 继续阅读 >>


吕子健 17/05/30 10:42:47
矩阵相乘 (得到C[4][3]) void arymul(int a[4][5], int b[5][3], int c[4][3])   {       int i, j, k;       int temp;       for(i = 0; i < 4; i++){           for(j = 0; j < 3; j++){               temp = 0;               for(k = 0; k < 5; k++){                   temp += 继续阅读 >>


吕子健 17/05/30 10:41:56