最近看了看tcpl,书里的列子异常漂亮。就自己用指针重新实现了一遍。在这记载几个,加深对c的理解。
第一个是字符串比较函数,如果相等就返回0,不等的话返回他俩的差值。我在xp+vs2008下编译都通过了,有兴趣的同志可以试试。废话不多说上程序。
int strcmp(char *s, char *t) { for (;*s == *t; s++, t++) { if (*s =='/0') { return 0; } } return *s - *t; }
第二个是字符串复制函数,这个是精简版,为什么没有是否结束,大家自己想想,呵呵。
void strcpy(char *pstr1, const char *pstr2) { while(*pstr1++ = *pstr2++) ; }
第三个是字符串联接函数,自己写的时候一定要记着把末尾的结束标志加上。
void strcat(char *pstr1, const char *pstr2, int n) { int i = 0; while((*pstr1) != '/0') ++pstr1; ; while(*pstr1++ = *pstr2++) if (n == ++i) { break; } ; *pstr1 ='/0'; }
第四个是读取每行的函数,第二个参数是控制这行读几个字符的。
int getline(char str[], int count) { int i = 0; int c = 0; for (i = 0; (i < count -1)&&((c = getchar()) != EOF) && c != '/n'; ++i) { str[i] = c; } if (c == '/n') { str[i] = c; ++i; } str[i] = '/0'; return i; }
第五个是输入一个日期,算出今天是这年的第几天的函数。
int day_of_year(int year, int mouth, int day) { static int daytable[2][13] = {{0,31,29,31,30,31,30,31,31,30,31,30,31}, {0,31,28,31,30,31,30,31,31,30,31,30,31}}; int lamp = year % 4 ==0 && year % 100 != 0 || year % 400 == 0; int *ptr = &daytable[lamp][13]; for (int i = 0; i < mouth; ++i) { day += *(ptr + i); } return day; }
第六个是输入数字月份,输出字符串月份的一个函数(这个函数写的很有水平,我很喜欢)。
char *GetMonthName(int mouth) { static char *name[] = { "Illegal month","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; return (mouth >=1 && mouth <= 12) ? name[mouth] : name[0]; }
好了,先总结到。看见好的继续写上来。这些函数看起来很简单。但我自己肯定写不出这么简洁,并且合理的程序来。还是那句话,路漫漫其修远兮 吾将上下而求索。