C中的字符串实在是有太多地方需要注意,昨天在知乎上看到一些问题细细一想,自己还是不是很懂。。。
这几天又开始听浙大翁恺老师的MOOC正好也讲到字符串,就大概总结了一些。。。有关字符串,自己一定会好好总结一下,等看完《C和指针》。
首先自己造个轮子吧,写一个自己的求字符串的函数(Mystrlen)。
#include <stdio.h> #include <stdlib.h> #define N 80 int Mystrlen(const char *pstr); int main() { int len; char str[N]; gets(str); len=Mystrlen(str); printf("%d",len); return 0; } int Mystrlen(const char *pstr) { char *qstr=pstr; while(*qstr) { qstr++; } return qstr-pstr; }
恩,我们这个Mystrlen已经可以计算出字符串的长度了,其实它和strlen这个函数的结果一模一样,所以这也意味着我们并没有考虑’ ’这个字节的长度。所以如果我们把上面的程序这样子写呢?
#include <stdio.h> #include <stdlib.h> #define N 80 int Mystrlen(const char *pstr); int main() { int len; char str[N]; gets(str); len=Mystrlen(str); printf("%d",len); return 0; } int Mystrlen(const char *pstr) { char *qstr=pstr; while(*qstr++); return qstr-pstr; }
结果比之前多了一个字符的长度,为什么会这样呢?我们分析一下while语句,其实是因为我们对qstr这个指针解引用后虽然判断出已经是空字符,它又自增了一次,这才跳出了循环。
那么再造一个Mystrcmp函数。对于strcmp这个函数我们知道比较两个字符串,相等返回0,前者大返回1,后者大返回-1.但是貌似这点我也查了一些资料,发现C语言的源码有两种,一种返回值是之前说的那样,但另一种则是,相等返回0,不相等则返回两个不相等字符的ASCII码的差值。不过,前者大返回正值,后者大则会返回负值。
#include <stdio.h> int Mycmp (const char*s1,const char*s2) { while(*s1==*s2&&*s1!='