文章目录
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 );//大写