c语言进阶(4)——字符函数的详细解析

1.strlen函数

size_t strlen( const char *string );

用途:用来计算字符串长度的。
要点:
(1)字符串已经有’\0’作为结束的表示符,strlen函数返回的是在字符串‘\0’之前的字符个数(不包括’\0’)。
(2)参数指向的字符串必须以‘/0’结尾。
(3)注意函数的返回值是size_t,是无符号的,所以(strlen函数返回的值相减一直都是大于等于0的)

c语言库的专业strlen实现

size_t __cdecl strlen (
        const char * str
        )
{
        const char *eos = str;

        while( *eos++ ) ;

        return( eos - str - 1 );
}

模拟实现strlen函数

//循环的思想
#include<assert.h>
size_t my_strlen1(const char* string)
{
	assert(string);
	int count = 0;
	while (*string)
	{
		count++;
		string++;
	}
	return count;
}

//指针减指针
size_t my_strlen2(const char* string)
{
	assert(string);
	const char* q = string;
	while (*q++)
	{
		;
	}
	return q - string;
}

//函数递归
size_t my_strlen3(const char* string)
{
	assert(string);
	if (*string == '\0')
		return 0;
	else
		return 1 + my_strlen3(string - 1);
}

2.strcpy函数

char* strcpy(char * destination, const char * source );

用途:将复制一个字符串到另一个字符数组里面。
要点:
(1)源字符串需要有‘/0’字符结尾。
(2)会将源字符串的‘/0’拷贝到目标空间。
(3)目标空间足够大,以确保能存放源字符串。
(4)目标空间需要可变。
C语言库专业的strcpy函数的实现

char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;

        while((*cp++ = *src++) != '\0')
                ;               /* Copy src over dst */

        return( dst );
}

strcpy函数的模拟实现

#include<assert.h>
char* my_strcpy(char* dst, const char* src)
{
	assert(dst && src);
	char ret = dst;
	while (*dst++ = *src++)
	{
		;
	}
	return ret;
}

3.strcat函数

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

用途:将源字符串接到目标空间字符串的后面。
要点:
(1)源字符串必须以 ‘\0’ 结束。
(2)目标空间足够大,能容的下要接的字符串。
(3)目标空间必须可修改。
(4)不能自己给自己追加,会造成死循环。

C语言库专业实现strcat函数

char * __cdecl strcat (
        char * dst,
        const char * src
        )
{
        char * cp = dst;

        while( *cp )
                cp++;                   /* find end of dst */

        while((*cp++ = *src++) != '\0') ;       /* Copy src to end of dst */

        return( dst );                  /* return dst */

}

模拟实现strcat函数

char* my_strcat(char* destination, const char* source)
{
	assert(destination && source);
	char* ret = destination;
	//找到目标空间‘/0’的位置
	while (destination++)
	{
		;
	}
	//开始接
	while (*destination++ = *source++)
	{
		;
	}
	return ret;
}

4.strcmp函数

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

用途:比较两个函数之间的大小,按照字符来比较。
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字;
第一个字符串等于第二个字符串,则返回0;
第一个字符串小于第二个字符串,则返回小于0的数字。
C语言库专业实现strcmp函数

int __cdecl strcmp (
        const char * src,
        const char * dst
        )
{
        int ret = 0 ;

        while((ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
                {
                ++src, ++dst;
                }

        return ((-ret) < 0) - (ret < 0); // (if positive) - (if negative) generates branchless code
}

strcmp函数的模拟实现

int strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 - *str2 > 0)
	{
		return 1;
	}
	else
		return -1;
}

5.strncpy函数

char * strncpy ( char * destination, const char * source, size_t num );

用途:指定num个源字符串拷贝到目标空间。
要点:
(1)拷贝num个字符从源字符串到目标空间。
(2)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
C语言库专业实现strncpy函数

char * __cdecl strncpy (
        char * dest,
        const char * source,
        size_t count
        )
{
        char *start = dest;

        while (count && (*dest++ = *source++) != '\0')    /* copy string */
                count--;

        if (count)                              /* pad out with zeroes */
                while (--count)
                        *dest++ = '\0';

        return(start);
}

模拟实现strncpy函数

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

6.strncat函数

char * strncat ( char * destination, const char * source, size_t num );

用途:指定num个字符从源字符串中接到目标空间处。
C语言库专业实现strncat函数

char * __cdecl strncat (
        char * front,
        const char * back,
        size_t count
        )
{
        char *start = front;

        while (*front++)
                ;
        front--;

        while (count--)
                if ((*front++ = *back++) == 0)
                        return(start);

        *front = '\0';
        return(start);
}

模拟实现strncat函数

char* strncat(char* destination, const char* source, size_t num)
{
	assert(destination && source);
	char* ret = destination;
	while (num)
	{
		if ((*destination++ = *source++) == 0)
			return ret;
		num--;
	}
	*destination = '\0';
	return ret;
}

7.strncmp函数

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

用途:比较num个字符。

模拟实现strncmp函数

int strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1 && str2);
	while (*str1 == *str2&&num--)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (!num)
	{
		return 0;
	}
	if (*str1 - *str2 > 0)
	{
		return 1;
	}
	else
		return -1;
}

8.strstr函数

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

用途:判断在str1中是否有str2的字符串。
要点:
(1)在str1找的第一个str2字符串的位置,直接返回该位置。
(2)未找到的话,返回的是NULL。

char * __cdecl 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 ( *s2 && !(*s1-*s2) )
                        s1++, s2++;

                if (!*s2)
                        return(cp);

                cp++;
        }

        return(NULL);

}

模拟实现strstr函数

char* strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 == *s2&&*s1!='\0'&&*s2!='\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cp;
		}
		cp++;
	}
	return NULL;
}

9.strtok函数

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

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

使用方法:以循环的形式实现。

int main()
{
	//char arr[] = "zpengwei@yeah.net";//"@."
	char arr[] = "192#168.120.85";
	char* p = "#.";
	char buf[20] = { 0 };//"zpengwei\0yeah\0net"
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	
	//char* ret = strtok(buf, p);
	//printf("%s\n", ret);
	//ret = strtok(NULL, p);
	//printf("%s\n", ret);
	//ret = strtok(NULL, p);
	//printf("%s\n", ret);

	//zpengwei
	//yeah
	//net
	return 0;
}

10. strerror函数

char * strerror ( int errnum );

用途:返回错误码,指出错误的信息。

/* strerror example : error list */
#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;
}

注释:参数是整数,代表的是错误类型的编码;此时errno代表的是此时错误的整数。

11. 相关字符转换函数

在这里插入图片描述
是的话返回大于零的整数,不是的话返回0;

12.字符转换函数

int tolower ( int c );//小写
int toupper ( int c );//大写

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰深入学习计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值