这是从《编写安全的代码》一书中学习到的第一个有启发性的例子。此文的大部分内容来自此书。
且看如下代码:
DWORD dwRet = IsAccessAllowed(…);
if (dwRet == ERROR_ACCESS_DENIED)
{
//检查失效,禁止操作
}
else
{
//允许操作
}
这个代码乍一看貌似没什么错误,但是我们设想一下,如果IsAccessAllowed函数(方法)返回的如果不是检查失败信息,而是类似于内存耗尽等其他错误信息,那么用户将会被允许操作,这是一件多么可怕的事情啊!
解决此问题的方法其实很简单,就是一句话“除非明确允许,否则就禁止”,请看下面的修正代码:
DWORD dwRet = IsAccessAllowed(…);
if (dwRet == NO_ERROR)
{
//允许操作
}
else
{
//检查失效,禁止操作
}
这一句话适应于很多场合,例如防火墙的规则设置,过滤用户的输入等等。但是,有一个地方遵循的正与这句话相反,那就是法律——除非明确禁止,否则都是合法的。
选择往往是很难的一件事情。大家都说之所以迷茫,是因为选项太多。面对众多的路,选择其中一条并用一生来行走并非易事。
最近我迷茫了,正像刚上大一的时候一样迷茫,不知自己将来要走向哪。想起明确自己的方向是因为如果继续在老路走下去,必将成为机器,这不是我想要的生活。我想要的生活是富有挑战性的,有新鲜感的,所以我要转变!
最终,我确定了我的发展方向——计算机安全。之所以涉足这个领域,源自于最初接触电脑的动机。那是十多年前的事情了,我想现在大多数新手一样崇拜黑客,妄想有朝一日可以干点什么。我还清楚的记得当时上网搜索了一下黑客应该如何入门,得到的答案是先学编程,于是进而搜索编程如何入门,得到的答案是学VB,于是,VB成了我学的第一个编程语言。
学习了VB,然后我就一头扎入到了程序设计领域不可自拔直至今日,期间确实忘记了最初为什么要学习编程。等到终于有一天得以审视自己走过的路的时候,才发现,自己的内心深处并没有抛弃最初的目标。既然重新浮出水面,那么就努力为之奋斗吧!
题目要求:根据树的先序遍历字符串,构造一棵二叉树,并输出其中序遍历字符串。
代码如下
#include <stdio.h>
#include <malloc.h>
struct Node
{
int data;
struct Node *LC,*RC;
}; //树节点的结构体
int i=0; //初始化字符串指针
char ch[20]; //定义字符串
void MakeTree(struct Node **T); //生成树
void BianLi(struct Node *T); //遍历树
int main ()
{
struct Node *MyTree; //头节点指针
gets(ch);
MakeTree(&MyTree);
BianLi(MyTree);
getch();
}
void MakeTree (struct Node **T)
{
struct Node *t;
if (ch[i]==’0′ || !ch[i])
{//判断边界条件
(*T)=NULL;
i++;
return;
}
(*T)=(struct Node *)malloc(sizeof(struct Node)); //建立根节点
(*T)->data=ch[i]-’0′;
i++; //指针后移
MakeTree(&((*T)->LC)); //构造左子树
MakeTree(&((*T)->RC)); //构造右子树
}
void BianLi (struct Node *T)
{
if (!T)
return;
BianLi(T->LC); //遍历左子树
printf(“%d”,T->data); //访问根节点
BianLi(T->RC); //遍历右子树
}
经过这个题目,偶更深刻的理解了树的递归定义:树是n(n>=0)个结点的有限集,在任意一棵非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互补相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
标签:
二叉树,
数据结构,
构造树,
树的遍历
这个题目主要使用位运算的知识来解答,曾经是一个公司的面试题。
代码如下:
#include
int main ()
{
int a,b;
int R[2]={'<','>'};
int result;
printf("Please input two number:");
scanf("%d%d",&a,&b);
result=(a-b)>>(sizeof(int)*8-1);
printf("The result is:a %c b",R[result+1]);
getch();
return 0;
}
需要注意的如下:
- 实现原理:a-b,结果为正则a>b,为负则a<b,而整数在内存中存储的最高位为符号位,这样,左移整数在内存中所占位数-1,即可间接判断出结果。
- sizeof(int)*8的意思为int型整数所占内存空间的大小,单位是位,这样算增强了可移植性。
- 输出答案的方法,除了用判断可以输出不同的结果外,数组也可以实现相似功能。
标签:
C语言,
位运算,
面试题
前几天为了使用VSS配置局域网,搞了整个晚上没有成功,原因竟是IP地址不在同一网段,因此做此备忘。
1、确认IP属于同一网段
2、确认工作组相同
3、控制面板->管理工具->本地安全策略->选择“本地策略”中的“安全选项”->设置“网络访问:本地帐户的共享和安全模式”的属性为“经典-本地用户以自己的身份验证”
4、正确设置防火墙,包括windows防火墙
以上步骤在Windows xp pro版本中测试通过,经过以上步骤,可以快速实现局域网互访。
标签:
VSS,
Windows,
局域网互访