文章目录
- 1.strlen函数
- 2.strcpy函数
- 3.strcat函数
- 4.strcmp函数
- 5.strncpy函数
- 6.strncat函数
- 7.strncmp函数
- 8.strstr函数
- 9.strtok函数
- 10. strerror函数
- 11. 相关字符转换函数
- 12.字符转换函数
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 );//大写



















