博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串的碎片整理。。。
阅读量:5115 次
发布时间:2019-06-13

本文共 2642 字,大约阅读时间需要 8 分钟。

C中的字符串实在是有太多地方需要注意,昨天在知乎上看到一些问题细细一想,自己还是不是很懂。。。

这几天又开始听浙大翁恺老师的MOOC正好也讲到字符串,就大概总结了一些。。。有关字符串,自己一定会好好总结一下,等看完《C和指针》。 

首先自己造个轮子吧,写一个自己的求字符串的函数(Mystrlen)。

#include 
#include
#define N 80int 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这个函数的结果一模一样,所以这也意味着我们并没有考虑’\0’这个字节的长度。所以如果我们把上面的程序这样子写呢?

#include 
#include
#define N 80int 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 
int Mycmp (const char*s1,const char*s2){ while(*s1==*s2&&*s1!='\0'){ s1++; s2++; } return *s1-*s2;}

额找了一份源代码ASCI C的。

/*strcmp function*/#include 
int(strap)(const char *sl,const char *s2){ /*compare unsigned char sl[],s2[]*/ for(;*sl==*s2;++sl,++s2) if(*sl=='\0') return(0); return((*(unsignedchar*)sl<*(unsignedchar*)s2)?-1:+1);}

好吧现在再来造轮子:写一个Mystrcpy。视频中介绍了一个一下strcpy的函数原型:char *strcpy(char *restrict dst,const char*restrict src);这里出现了一个新的关键字restrict,它是C99新加的关键字,它主要是说这两个字符串不可以重叠。额,,这里解释估计不是很清楚,我会再查资料详细解释一下。留个坑。

char  * Mycpy( char* dst,const char *src){    char*ret=dst;    while(*src){        *dst++=*src++;    }    *dst='\0';    return ret;}

同样我们可以在分析一下,while语句,其实*dst=*src不就是把*src赋值给*dst吗?这个表达式的值不就是*src吗?所以我们还可以写成这样:

while(*dst++=*src++);

接下来我们再来看看另一个函数,其实是两个:

char* strchr(const char *s,int c);//表示从这个字符串左边开始找字符char* strrchr(const char*s,nnt c);//表示从这个字符右边开始找字符

比如说,我们现在要找”hello”这个字符串的l出现的位置使用这个函数我们可以得到的结果是”llo”。如果我们需要得到he怎么办呢?

#include 
#include
int main(){      char s[]="hello";      char *p,*t;      char c;      p=strchr(s,'l');      c=*p;      *p='\0';      strcpy(t,s);      puts(t);
*p=c;      return 0;}

这样我就可以得到he了,为什么呢?因为我们通过strchr这个函数得到p指向了第一个l,然后我们把它改为NUL那么s不是就成为”he”了吗?

其实,还有可以在字符串中找字符串的函数,额,也留个坑吧。

最近需要写超级多的的数学作业,而且周末还有四级考试,肯定是要把重心放到四级上了。至于校赛,昨天也写了两道水题不过,就去签个到吧。那忙完这一周,我会抓紧写blog的,把翁恺的课堂笔记写完,还有北大的,计蒜客上有一道ACM的题还没有搞清楚。这些都是下周要干的事。。。先把四级过了。。。

转载于:https://www.cnblogs.com/kugwzk/p/5054054.html

你可能感兴趣的文章
linux中启动与终止lnmp的脚本
查看>>
gdb中信号的处理[转]
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
Jzoj4757 树上摩托
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>