字符串的碎片整理。。。

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

#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!=‘\0‘){
      s1++;
      s2++;
      }
      return *s1-*s2;
}

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

/*strcmp function*/
#include <string.h>
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 <stdio.h>
#include <string.h>
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的题还没有搞清楚。这些都是下周要干的事。。。先把四级过了。。。

时间: 2024-08-09 22:01:25

字符串的碎片整理。。。的相关文章

浅谈磁盘碎片整理的好处与方法

磁盘碎片整理的好处 1.磁盘碎片整理可以让系统运行更顺畅,减少卡顿的现象,提高系统性能.2.需要注意的是,使用固态硬盘的用户千万不要使用"磁盘碎片整理"功能,因为所使用的技术不同,使用Windows自带的磁 盘碎片整理会使固态硬盘的寿命大大减短. 磁盘碎片整理的方法步骤 打开"此电脑",选中任意磁盘盘符,然后点击"管理"-"优化" 选中整理的磁盘,可以使用"Ctrl"+ "鼠标左键"来选

磁盘碎片整理程序的原理是什么?

盘碎片整理,就是通过系统软件或者专业的磁盘碎片整理软件对电脑磁盘在长期使用过程中产生的碎片和凌乱文件重新整理,释放出更多的磁盘空间,可提高电脑的整体性能和运行速度. 磁盘碎片应该称为文件碎片,是因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的.硬盘在使用一段时间后,由于反复写入和删除文件,磁盘中的空闲扇区会分散到整个磁盘中不连续的物理位置上,从而使文件不能存在连续的扇区类.这样,再读写文件时就需要到不同的地方去读取,增加了磁头的来回移动,降低了磁盘的访问速度.当应用

Defraggler2.15.742汉化单文件(磁盘碎片整理)

Defraggler2.15.742汉化单文件(磁盘碎片整理工具)由Black Hawk 汉化软件语言,绿色单文件版,去掉菜单在线帮助,软件下方在线帮助.检查更新.Defraggler中文版是一个轻量级的整理工具,但它可以快速高效的整理某个磁盘.文件夹甚至一个文件.也可以对硬盘进行查错,Defraggler对系统资源占用极小.无需添加系统服务,用起来也实在是太简单. 百度下载:http://pan.baidu.com/s/1o6wS8Bo 百度指导:http://dwz.cn/spjIn

sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)

本文讲述了SQL SERVER中碎片产生的原理,内部碎片和外部碎片的概念.以及解决碎片的办法和填充因子.在数据库中,往往每一个对于某一方面性能增加的功能也会伴随着另一方面性能的减弱.系统的学习数据库知识,从而根据具体情况进行权衡,是dba和开发人员的必修课 本文需要你对索引和SQL中数据的存储方式有一定了解 在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构(表上没有聚集索引则为堆结构,不在本文讨论之列)如下图: 在聚集索引B树中,

Python内置的字符串处理函数整理

Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 函数的使用方法 str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str)例:print '%s length=%d' % (str,len(str)) 字母处理全部大写:str.upper()全

小知识-为什么Linux不需要磁盘碎片整理

转载至:http://beikeit.com/post-495.html 简单译文: 这段linux官方资料主要介绍了外部碎片(external fragmentation).内部碎片(internal fragmentation)的概念及相关情况,说明了linux文件系统在磁盘还有5%空闲空间的情况下是不需要碎片整理的.(Linux native file systems do not need defragmentation under normal use and this include

Defraggler磁盘碎片整理工具,让你的电脑读写速度更快

相信大家都听说过磁盘碎片整理吧,所谓磁盘碎片,通俗的来说,就是指计算机中的各种文件最开始在磁盘中存储的时候地址都是连在一起的,但是随着文件 的多次读写,或者说多次的移动复制等操作,这些文件在磁盘中的地址已经不连续了,这些不连续的文件就成为磁盘碎片,不连续带来的后果就是让你的电脑读写文 件的速度变慢,所以今天就给大家分享一款磁盘碎片整理的软件——Defraggler,它能他这些碎片重新组合起来,让文件的地址又变成连续的,这样就能 加快文件的读写速度. 软件截图: 百度百科介绍:Piriform 公

为什么Linux不需要碎片整理?

如果你是一个 Linux 用户,你可能会听说 Linux 的文件系统不需要碎片整理.你也可能会注意到 Linux 的发行版本也都没有磁盘碎片整理的功能.这是为什么呢? 要理解为什么 Linux 的文件系统不会像 Windows 的文件系统一样产生碎片,你首先要明白碎片到底是如何产生的,还有这两大操作系统的文件系统的工作方式到底有什么不同. 什么是磁盘碎片? 很多 Windows 的用户,甚至包括一些没有经验的用户,都相信定时整理文件系统中的碎片会让他们的电脑运行得更快.但他们都不知道这是为什么.

SQL Server索引碎片整理实际操作记录

SQL Server 版本是 2008 R2. 查询数据库索引碎片情况的 SQL 语句(来源): SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, ind.name AS IndexName, indexstats.index_type_desc AS IndexType, indexstats.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL