了解且模拟实现字符串函数

目录

一、求字符串长度

1.了解函数strlen

模拟实现strlen

二、 长度不受限制的字符串函数

1.了解strcpy

模拟实现strcpy 

2.了解strcat

模拟实现strcat

 3.了解strcmp

模拟实现strcmp

三、长度受限制的字符串函数

1.了解strncpy

模拟实现strncpy

 2.了解strncat

模拟实现strncat

3.了解strncmp

 模拟实现strncmp

 四、字符串查找

1.了解strstr

模拟实现strstr

2.了解strtok 

五、错误信息报告

了解strerror

六、字符分类函数

拿字符转换举例

 完结撒花🎉


一、求字符串长度

1.了解函数strlen

size_t strlen(const char*str)

参数指向字符串已经是以'\0'结尾,strlen函数返回的是在字符串中‘\0’前面出现的字符个数。

注意函数的返回值为size_t,是无符号的。

例如下面代码

#include <stdio.h>
int main() {
    const char*str1 = "abcdef";
    const char*str2 = "bbb";
    if(strlen(str2)-strlen(str1)>0)
    {
        printf("str2>str1\n");
    }
else
    {
        printf("srt1>str2\n");
}
return 0; }

运行结果

str2>str1

原因就是差值是无符号的,原反补码相同,数值是一个很大的正数。 

模拟实现strlen

方法有很多,我们在这里介绍指针-指针的方式

int my_strlen(char *s) {
}
char *p = s;
while(*p != ‘\0’ )
       p++;
return p-s;

二、 长度不受限制的字符串函数

1.了解strcpy

char* strcpy(char*dst,const char*src)

源字符(src)串必须以'\0'结束,会将源字符串中的‘\0’拷贝到目标空间(dst)。

目标空间必须足够大和可变。

模拟实现strcpy 

char *my_strcpy(char *dst, const char*src)
{
char *ret = dest;
assert(dst&&src);
while((*dst++ = *src++)){;}
return ret;
}

2.了解strcat

char * strcat ( char * destination, const char * source )

源字符串必须以'\0'结束,目标空间必须足够大且能修改。

模拟实现strcat

char *my_strcat(char *dst, const char*src)
{
    char *ret = dst;
    assert(dest&&src);
    while(*dest)
    {
        dest++;
    }
    while((*dest++ = *src++)){;}
    return ret; 
}

 3.了解strcmp

int strcmp ( const char * str1, const char * str2 )

标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字 

模拟实现strcmp

int my_strcmp (const char * src, const char * dst)
{
int ret = 0 ;
assert(src &&dst);
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        {++src, ++dst;}
if ( ret < 0 )
        ret = -1 ;
else if ( ret > 0 )
        ret = 1 ;
return( ret );
}

三、长度受限制的字符串函数

1.了解strncpy

char * strncpy ( char * dst, const char * src, size_t num )

拷贝num个字符从源字符串到目标空间。

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。 

模拟实现strncpy

char * my_strncpy ( char * dst, const char * src, size_t num )
{
    char*ret=dst;
    assert(src&&dst);
    while(num--)
    {
        if(*src)
        *dst++=*src++;
        else
        *dst++='\0';
    }
    return ret;
}

 2.了解strncat

char * strncat ( char * dst, const char * src, size_t num )

如果源中C字符串的长度小于num,则仅复制到终止空字符的内容。 

举例

int main () {
  char str1[20];
  char str2[20];
  strcpy (str1,"To be ");
  strcpy (str2,"or not to be");
  strncat (str1, str2, 6);
  puts (str1);
  return 0;
}

 运行结果

To be or not

模拟实现strncat

char * my_strncat ( char * dst, const char * src, size_t num )
{
    char*ret=dst;
    assert(dst&&src);
    
    while(*dst)
    {
        dst++;
    }
    size_t len=strlen(src);
    if(num>len)
        num=len;
    while(num--)
    {
        *dst++=*src++;
        *(dst+1)='\0';
    }
    return ret;
}

3.了解strncmp

int strncmp ( const char * str1, const char * str2, size_t num )

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。 

 模拟实现strncmp

int my_strncmp ( const char * str1, const char * str2, size_t num )
{
    int ret=0;
    assert(str1&&str2);
    while(!(ret)&&*str2&&str1&&num--)
    {
        ret=(*(unsigned char*)str2-*(unsigned char*)str1);
        str1++;
        str2++;
    }
    
    if(ret<0)
        return -1;
    else if (ret>0)
        return 1;
    return ret;
}

 四、字符串查找

1.了解strstr

char * strstr ( const char *str1, const char * str2)

返回str1中首次出现的str2的指针,如果str2不是str1的一部分,则返回空指针。 

模拟实现strstr

char *  my_strstr (const char * str1, const char * str2)
{
    char *cp = (char *) str1;
    char *s1, *s2;
    if ( !*str2 )
        return((char *)str1);
    while (*cp)
    {   s1 = cp;
        s2 = (char *) str2;
        while ( *s1 && *s2 && !(*s1-*s2) )
        {s1++;s2++;}
        if (!*s2)
        {return(cp);}
        cp++;
    }
    return(NULL);
}

2.了解strtok 

char * strtok ( char * str, const char * sep )

sep参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
如果字符串中不存在更多的标记,则返回 NULL 指针。

举例

#include <stdio.h>
#include <string.h>
int main () {
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}

 结果

This
a
sample
string

五、错误信息报告

了解strerror

char * strerror ( int errnum )

 返回错误码,所对应的错误信息。

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main () 
{
  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
  printf ("Error opening file unexist.ent: %s\n",strerror(errno));
  //errno: Last error number
  return 0; 
}

六、字符分类函数

拿字符转换举例

int tolower ( int c )
int toupper ( int c )
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    if (isupper(c))
    c=tolower(c);
    putchar (c);
    i++; 
}
    return 0;
}

 运行结果

test string.

 完结撒花🎉

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值