如果我在桂林遇见你

如果我在桂林遇见你,我们一定要在阳春四月去南溪山看樱花,互相替对方拂开肩上落花;

如果我在桂林遇见你,我们一定要在六月去西山看荷花,见鱼儿摆尾流连荷叶连田田;

如果我在桂林遇见你,我们一定要在金秋十月漫步于普陀路,看街道两旁红枫浸染霜色;

如果我在桂林遇见你,我们一定要在腊月去尧山看雪,在尧山顶许愿,遥望四方皆似白玉砌云端;

如果我在桂林遇见你,我们一定要在早晨去小店吃米粉,一个三两要锅烧不要酸辣,一个二两什么都要;

如果我在桂林遇见你,我们一定要在夜晚走过滨江路,看对面七星峰闪耀七彩的光;

如果我在桂林遇见你,我们一定要在七星公园逗弄冥顽猴子,看它为我们手中的花生搔首弄姿而笑个满怀;

如果我在桂林遇见你,我们一定要去伏波山,听导游说说还珠洞的美丽传说,然后摸摸试剑石,再在铁佛寺算个命;

如果我在桂林遇见你,我们一定要勾手去逛一逛正阳街,它见证了桂林城数百年的世事更迭,有你我共同的回忆;

如果我在桂林遇见你,我们一定要在钟楼下照个相,任凭人潮汹涌,却能够认定你我就是彼此的那个人;

如果我在桂林遇见你,我们一定要在微笑堂整点开市的时候共同进入商场,看商场人员九十度鞠躬地说:“欢迎光临”;

如果我在桂林遇见你,我们一定要装作学生屏息凝气进入王城,拿着假学生证爬上独秀峰,摸一摸石老龟,祈求彼此长命百岁;

如果我在桂林遇见你,我们一定要在刀锋书店要两杯拿铁咖啡,看一看书,再等待傍晚时分,百度酒吧的喧闹;

如果我在桂林遇见你,我们一定要在桂花飘香的街道上走过,你不必多高,但可以为我折一枝饱香的花枝;

如果我在桂林遇见你,我们一定要在海天肠粉吃一顿肠粉,你去买肠粉,我打两碗白粥,等候在后堂;

如果我在桂林遇见你,我们一定要在王城商厦后面吃那位老婆婆做的马蹄糕,五毛钱两个,加价不加量;

如果我在桂林遇见你,我们一定要在油炸大王里大快朵颐,再去旁边的奶茶店要两杯鲜榨果汁,给老板娘十元,她会端着果汁过来并找还两元钱硬币;

如果我在桂林遇见你,我们一定要去彤言物语吃蛋挞,坐在沙发上和老外说蹩脚的英语,惹得旁边的小朋友也嘻嘻地笑起来;

如果我在桂林遇见你,我们一定要走上解放桥,吃几块新疆同胞做的名不副实的板栗糕,保证心疼肉也疼;

如果我在桂林遇见你,我们一定要去临桂,摘桃金娘,吃五通的甘蔗和马蹄,瞻仰李先生和白先生,看两江机场里飞机起降;

如果我在桂林遇见你,我们一定要去灵川海洋看银杏,顺便吃锅灵川狗肉,一黄二白三花四黑,同食腐乳辣酱不腥膻;

如果我在桂林遇见你,我们一定要坐车去阳朔过月牙山,在大榕树公园里对歌、抛绣球,买花冠,吃沙田柚,再在西街徜徉几回,对着洋娃娃say hello;

如果我在桂林遇见你,我们一定要在兴安留宿一宿,早上穿着拖鞋去灵渠,再穿戏服扮一回皇上皇后,同时撕咬一块钱一串的烤虾烤螃蟹;

如果我在桂林遇见你,我们一定要去资源漂流,手放河灯一盏盏,再攀上丹霞之魂——八角寨;

 

如果我在桂林遇见你,我们一定要去恭城看桃花,喝油茶,吃月柿;

如果我在桂林遇见你,我们一定要去灌阳喝好友亲自酿的葛根酒,然后相视一笑;

如果我在桂林遇见你,我们一定要去永福吃罗汉果,摘山葡萄,然后瞻仰历史文化遗迹,学习福寿文化;

如果我在桂林遇见你,我们一定要去龙胜摘新鲜的杨梅,吃血肠,看少数民族长发姑娘起歌舞;

如果我在桂林遇见你,我们一定要在有朋自远方来时买一碗荔浦芋扣肉,告诉他这就是《宰相刘罗锅》里让乾隆皇帝也赞不绝口的美味;

如果我在桂林遇见你,我们一定要学着平乐话纠正平乐不是贫穷落后,是平安快乐;

如果我在桂林遇见你,我们一定要到全州湘山寺拜一拜,再在天湖钓禾花鱼,吃醋血鸭——要问正宗的醋血鸭哪里有,何必舍近求远,蒋氏家味馆的醋血鸭就很正宗;

如果我在桂林遇见你,我们一定要在南站北站乘车进站接受**叔叔盘问,让我们出示身份证时,义正言辞地鄙视他,请他先出示警官证;

如果我在桂林遇见你,请你一定要在节假日陪我在七星公园正门默默观察那个指挥交通的**若干分钟,陪我长叹今生不能得嫁此帅哥叔叔真是遗憾,然后弹一下我的脑瓜儿,说我花痴;

如果我在桂林遇见你,我们一定要在结婚的时候到春记烧鹅摆上几十桌,我们接受亲戚朋友的祝福,背景是在维纳斯或者巴黎印象拍的结婚照,上面有大大的玉兰花球;

如果我在桂林遇见你,我们一定要去彰泰第六园看看,不必费心费力买下其中一幢,只要看看,然后远远地呸一句:“妈哟,这房子也值一万块一平?”

如果我在桂林遇见你,我们的蜜月旅行不必去马尔代夫,也不要拘囿于桂林城区,去远一点的地方吧,诸如阳朔、龙胜和兴坪结婚岛;

如果,如果我真的在桂林遇见你,可以和你携手一段新的人生旅程,我将感谢上苍将你赐予我——因为即使我可以决定爱不爱你,在你需要关怀时是否献上一副柔弱却有力的肩膀,我总是把握不了缘分。而如果真的遇见你,不早一分,不晚一秒,我不会奢求万年,只要你我在世的每分每秒,每时每刻。

如果,如果我真的在桂林遇见你,可以和你携手一段新的人生旅程,我不能承诺将我的爱百分之百给你,因为还有一部分,我会给我的父母,你的父母,以及我们的孩子;

而如果,如果我真的在桂林遇见你,可以和你携手一段新的人生旅程,不管开头是:“仲夏的桂林城闷热得像是蒸笼,XXX坐于树下看书”;抑或是:“如果XX还记得他与XXX第一次相遇的情形,他或许会想到自己翻墙去时家内院躲在石榴树上被她发现”;还是:“他们是哪个时候相遇的呢?XXX坐在电视机前看着《越狱》暗自思忖道。她是记得的,九月份的艳阳,衬着李氏博物馆内的冷气,让穿着白棉布短衫的她冷不防打了个喷嚏”,我都会预计到结局——

“有老妪与老翁相携走在滨江路上,看见一年轻男子背着女友,说你最近可是胖了,女子拿着书作势要打,却反将男子搂得更紧,又辩驳道不是我舍不得打你,只是这书宝贵。”

桂林城的故事总是特别多,有多少鲜事被掩埋?有多少常闻被风传?多年后人们的记忆中是否有这样一个你?和这一样一个我?

或许,或许滨江路两旁郁葱的参天大树会记得,记得这让人怦然心动的爱意萌芽的时光,记得往来的风,吹散了心头的尘。

我,遇见你。

VI 自动文件头

由于最近个人在写码字的时候总是想一个文件创建起来总想着希望他可以自动的描述一下文件的基本信息,然后又看见貌似别人在创建.c文件的时候会自动的生成一些文件头信息,于是自己试着google配置了一下,详细的配置情况如下:

autocmd BufNewFile *.[ch],*.hpp,*.cpp exec “:call SetComment()”
func SetComment()
call setline(1,”/*===============================================================”)
call append(line(“.”), “* Copyright (C) “.strftime(“%Y”).” All rights reserved.”)
call append(line(“.”)+1, “* “)
call append(line(“.”)+2, “* #File :”.expand(“%:t”))
call append(line(“.”)+3, “* #Author : Arts”)
call append(line(“.”)+4, “* #Create date :”.strftime(“%Y-%m-%d %H:%M”))
call append(line(“.”)+5, “* #Express : “)
call append(line(“.”)+6, “* #Modified date :”.strftime(“%Y-%m-%d %H:%M”))
call append(line(“.”)+7, “* #Company : Arts”)
call append(line(“.”)+8, “* “)
call append(line(“.”)+9, “================================================================*/”)
call append(line(“.”)+10, “”)
endfunc
“更新最近修改时间和文件名
function UpdateTitle()
call setline(4,”* #File :”.expand(“%:t”))
call setline(8,”* #Modified date :”.strftime(“%Y-%m-%d %H:%M”))
endf
“判断前10行代码里面,是否有Modified这个单词,
“如果没有的话,代表没有添加过作者信息,需要新添加;
“如果有的话,那么只需要更新即可
function TitleDet()
let n=1
while n < 10
let line = getline(n)
if line =~’^.*Modified.*$’
call UpdateTitle()
return
endif
let n=n+1
endwhile
call AddTitle()
endfunction
au BufWritePost * :call UpdateTitle()
autocmd BufNewFile * normal 7G 17l

效果如下:
vi

 

Linux C 学习笔记 十三

数据结构

 

数组

struct Element

{

//…………

};

struct Eelement *create(size_t len);

 

int add(struct Element,struct Element e);

 

int del(struct Elements,size_t index);

 

outAll(struct Elements);

 

void desttory(struct Element);

 

 

队列

 

struct Node

{

Element e;

struct Node *next;

}

create

destroy

enqueue

dequeue

size

iterate //遍历

front //查看

 

Node:结点,数据结构中用与保存数据的单元。

 

栈结构 stack

 

push:亚栈

pop:弹栈

 

 

create()

destroy()

size()

top()

iterate()

 

 

 

链表list

create()

destroy()

insert()

delete()

size()

iterate()

ARRAY

array.h

#ifndef __ARRAY_H
#define __ARRAY_H
#include “element.h”

typedef struct array
{
Element *eHead;
size_t max_size;
size_t counter;
}Array;

//创建并初始化数据
Array *create(size_t len);
//销毁数据
void destroy(Array *arr);
//增加数组元素
ssize_t add(Array *arr,Element e);
//删除数组元素
ssize_t del(Array *arr,size_t index);
//输出数组信息
void out(Array *arr);

//
ssize_t size(Array *arr);
ssize_t update(Array *arr,size_t index,Element e);

#endif

element.h

#ifndef __ELEMENT_H__
#define __ELEMENT_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
typedef struct employee
{

char name[20];
int age;
float salary;
}Element;

 

#endif

array.c

#include”array.h”
#define INIT_MAX_SIZE 5
//创建并初始化数据
Array *create(size_t len)
{
Array *arr = (Array *)malloc(sizeof(Array));
assert(arr != NULL);
memset(arr,0,sizeof(Array));

Element *eHead =
(Element *)malloc(len*sizeof(Element));
assert(eHead != NULL);
memset(eHead,0,len*sizeof(Element));

arr->eHead = eHead;
arr->max_size = len;
return arr;
}
//销毁数据
void destroy(Array *arr)
{
assert(arr != NULL);
if(arr->eHead != NULL)
free(arr->eHead);

free(arr);//不会修改arr = NULL 不会修改函数外的指针
arr = NULL;
}
//增加数组元素
ssize_t add(Array *arr,Element e)
{

assert(arr != NULL);
if(arr->counter >= arr->max_size)
{
Element *eNew = (Element *)
realloc(arr->eHead,(arr->max_size+1)*sizeof(Element));
if(eNew == NULL)
return -1;
arr->eHead = eNew;
arr->max_size++;
}
//添加数组元素
*(arr->eHead+arr->counter) = e;
arr->counter++;
return 0;
}
//删除数组元素
ssize_t del(Array *arr,size_t index)
{
assert(arr != NULL);
//越界
if(index >= arr->counter)
return -1;
int i;
//移动数组,填补空隙
for(i =index;i < arr->counter;i++)
{
*(arr->eHead+i) = *(arr->eHead+i+1);
}
arr->counter–;
return 0;
}

static void out_element(Element *e)
{
printf(“=============Element info=================\n”);
printf(“Name:%s “,e->name);
printf(“Age:%d “,e->age);
printf(“Salary:%f\n “,e->salary);
printf(“\n”);
}

//输出数组u信息
void out(Array *arr)
{
assert(arr != NULL);
int i;
for(i = 0;i<arr->counter;i++)
{
printf(“===%d===”,i);
out_element(arr->eHead+i);
}
}

array_test.c

#include”element.h”
#include”array.h”
int main(void)
{

Array *arr = create(2);
Element e1 = {“Zhangsan”,22,10000.0};
Element e2 = {“Lisi”,23,8000.0};
Element e3 = {“wangwu”,33,99999.0};

add(arr,e1);
add(arr,e2);
out(arr);

 

return 0;
}

 LIST

list.h

#ifndef __LIST_H__
#define __LIST_H__

#include”element.h”
typedef struct node Node;
struct node
{
Element *e;
Node *next;
};

Node *create();
void destroy(Node *head);
void insert(Node *head,Element *e);
void delete(Node *head,Element *e);
Node *find(Node *head,Element *e);
int size(Node *head);
void iterate(Node *head);

#endif

element.h

#ifndef __ELEMENT_H__
#define __ELEMENT_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
typedef struct employee
{

int id;
char name[20];
int age;
float salary;
}Element;
void out_element(Element *e);
Element *make_element(Element *e,int id,char *name,int age,float salary);
#endif

element.c

#include”element.h”
void out_element(Element *e)
{
printf(“\n==========Element info===============\n”);
printf(“ID:%d “,e->id);
printf(“Name:%s “,e->name);
printf(“Age:%d “,e->age);
printf(“Salary:%.2f”,e->salary);
printf(“\n”);
}

Element *make_element(Element *e,int id,char *name,int age,float salary)
{
assert(e != NULL);
e->id = id;
strcpy(e->name,name);
e->age = age;
e->salary = salary;
return e;
}

list.c

#include”list.h”

/*
* 创建链表
*/
Node *create()
{
Node *head = (Node *)malloc(sizeof(Node));
assert(head != NULL);
memset(head,0,sizeof(Node));

return head;
}

/*
* 销毁链表
*/
void destroy(Node *head)
{
if(head == NULL)
return ;
destroy(head->next);
free(head);
printf(“freed: %p\n”,head);
}

/*
* 向链表中插入元素
*/
void insert(Node *head,Element *e)
{
assert(head != NULL);

//创建新的节点
Node *pNew = (Node *)malloc(sizeof(Node));
assert(pNew != NULL);
memset(pNew,0,sizeof(Node));

pNew->e = e;

Node *pPre = head;
Node *pCur = head->next;

while(pCur != NULL)
{
if(pCur->e->id >= e->id)//找到元素合适的插入位置
break;

//指针后移
pPre = pPre->next;
pCur = pCur->next;
}
//查找一个和合适的插入位置

pNew->next = pCur;
pPre->next = pNew;
}

/*
* 删除链表中某个元素的节点
*/
void delete(Node *head,Element *e)
{
assert(head != NULL);
Node *pCur = head->next;
Node *pPre = head;
while(pCur != NULL)
{
if(pCur->e->id == e->id)//找到了合适的插入位置
break;
pPre = pPre->next;
pCur = pCur->next;
}

//空链表,或者未找到
if(pCur == NULL)
return ;
//删除

pPre->next = pCur->next;
free(pCur);
}

/*
* 查找包含某个元素的节点
*/
Node *find(Node *head,Element *e)
{
assert(head != NULL);
Node *pCur = head->next;
while(pCur != NULL)
{
if(pCur->e->id == e->id)
break;
pCur = pCur->next;
}
return pCur;
}

/*
* 返回链表的长度
*/
int size(Node *head)
{
assert(head != NULL);
int counter = 0;
Node *pCur = head->next;
while(pCur != NULL)
{
pCur = pCur->next;
counter++;
}
return counter;
}

/*
* 遍历链表
*/
void iterate(Node *head)
{
assert(head != NULL);
Node *pCur = head->next;
while(pCur != NULL)
{
out_element(pCur->e);
pCur = pCur->next;
}

//if(head == NULL)
//return;
//iteratr(head->next);
//if(head->e != NULL)
//out_element(head->e);
}

list_test.c 

#include “list.h”
int main(void)
{

Node *list = create();
Element *e1 = (Element *)malloc(sizeof(Element));
Element *e2 = (Element *)malloc(sizeof(Element));
Element *e3 = (Element *)malloc(sizeof(Element));

make_element(e1,1,”Zhangsan”,22,10000.0);
make_element(e2,2,”Lisi”,33,999999.0);
make_element(e3,3,”wangwu”,44,8888.0);

insert(list,e1);
insert(list,e2);
insert(list,e3);

iterate(list);

printf(“%d\n”,size(list));
printf(“============================\n”);

out_element(find(list,e2)->e);

delete(list,e2);
delete(list,e3);

printf(“%d\n”,size(list));
destroy(list);

free(e1);
free(e2);
free(e3);

return 0;
}

Linux C 学习笔记 十二

 

高级指针

int f //整形变量

int *f //整形指针变量

int *f,g

int f() //返回int的函数

int *f() //返回int *的函数

int (*f)() //返回int函数指针

int f[] //int 数组

int *f[] //int*元素数组,也就是指针数组?

Int (*f[])() //返回int函数指针数组

int *(*f[])() //返回int *函数指针数组

 

 

 

函数指针

指向函数存放地址的指针

* &对其无影响,既不修改内容,也不修改偏移量。

默认偏移量为1

对函数指针进行算数运算+ – ,不能偏移至其它函数的地址

 

转移表

 

基本计算器的实现

#include<stdio.h>
#include<assert.h>

double add(double x,double y)
{
return x+y;
}
double sub(double x,double y)
{
return x-y;
}
double div(double x,double y)
{
assert(y != 0);
return x/y;

}
double mul(double x,double y)
{
return x*y;
}

//函数指针数组
double (*opFun[])(double,double) =
{
add,sub,mul,div
};

char ops[] =
{
‘+’,’-‘,’*’,’/’
};

double oper(double x,double y,double(*opFun)(double,double))
{
return opFun(x,y);
}

int main(void)
{
double x=0,y=0,ret;
char op=’\0′;

printf(“Please input your exp:”);
scanf(“%lf%c%lf”,&x,&op,&y);
int i;
int len = sizeof(ops)/sizeof(ops[0]);
for(i=0;i<len;i++)
{
if(ops[i] == op)
{
//命中匹配的运算符
ret = oper(x,y,opFun[i]);
break;
}
}
if(i == len)
{
printf(“Unkown operator\n”);
exit(1);
}

printf(“Done: %lf %c %lf = %f\n”,x,op,y,ret);
return 0;
}

 

fun_funp.c

#include<stdio.h>

int fun1()
{
printf(“by fun1\n”);
}

int fun2()
{
printf(“by fun2\n”);
}
void out_fun(void (*fp)(),int n)
{
printf(“n:%d\n”,n);
fp();//这种形式呢就称为回调过程callback
}

int main(void)
{

out_fun(fun1,100);

return 0;
}

 

funp.c

#include<stdio.h>

int fun1(int n)
{
printf(“n in fun1:%d\n”,n);
return 1;
}
int fun2(int n)
{
printf(“n in fun2:%d\n”,n);
return 2;
}

 

int main(void)
{

int (*fp)(int); //函数指针
fp = fun1;
fp = &fun1;
fp = *fun1;
//fun(100);
fp(200);
(*fp)(200);

printf(“fun1:%p\n”,fun1);
printf(“fun1:%p\n”,*fun1);
printf(“&fun1:%p\n”,fp);

printf(“fun1:%p\n”,fun1+1);
printf(“fun1:%p\n”,*fun1+1);
printf(“&fun1:%p\n”,fp+1);
return 0;
}

max.c

#include<stdio.h>

struct employee
{

char name[20];
int age;
float salary;
}Employee;

typedef struct employee Employee

Employee *getMax(Employee emps[],int len,int (*comp)(Employee *,Employee *))
{
int i;
Employee *max_emp = emps;
for(i =0;i<len;i++)
{
if(comp(emps+i,max_emp)>0)
max_emp = emps+i;
}
return max_emp;
}

void out_emp(Employee *e)
{
printf(“—-Employee info——-\n”);
printf(“Name:%s “e->name);
printf(“Age:%d “e->age);
printf(“Salary:%.2f “e->salary);
printf(“\n”);
}

int comp_name(Employee *e1,Employee *e2)
{
return strcmp(e1->name,e2->name);
}
int comp_age(Employee *e1,Employee *e2)
{
return e1->age – e2->age;
}
int comp_salary(Employee *e1,Employee *e2)
{
if(e1->salary – e2->salary > 0)
return 1;
else
return -1;
}

int main(void)
{
Employee emps[] =
{
{“Zhangsan”,22,23232.2},
{“Lisi”,11,890098.3},
{“Wangwu”,44,5465.5}
};

int len = sizeof(emps)/sizeof(emps[0]);
out_emp(getMax(emps,len,comp_name));
return 0;
}

 

1 2 3