LinuxC简谈之字符串函数及其实现

来源:互联网 发布:网络整合营销 编辑:程序博客网 时间:2024/06/05 15:58
研究了一段时间字符串后,我总结了一些关于字符串函数的理解,字符串函数也称为字符串处理函数,如字符串求长度(strlen)、字符串复制(strcpy)、字符串连接(strcat)、字符串比较(strcmp)等等。在这里我将介绍一下这些字符串函数的原型以及我自己实现这些功能的函数及用法。
1、字符串求长度(strlen)
函数原型:
int strlen(const char *str);
我的实现:
//求字符串长度int Strlen(const char *str){if (str == NULL){return -1;}int len = 0;while (*str++){len++;}return len;}
作用及返回值:
求出该字符串的长度并返回该长度(不包括'\0')。str指向空,返回-1。


2、字符串复制(strcpy)
函数原型:
char *strcpy(char *dest,const char *src);
我的实现:
//复制字符串char *Strcpy(char *dest,const char *src){if (dest == NULL || src == NULL){return NULL;}char *str1 = dest;while (*str1++ = *src++);return dest;}
作用及返回值:将src指向的字符串整个保存到dest指向的空间,包括'\0'。要求dest指向的空间足够大,可以容纳下src指向的字符串,否则会发生溢出。返回dest,dest或src指向空,返回空。


3、有限制的字符串复制(strncpy)
函数原型:
char *strncpy(char *dest,const char *src,int n);
我的实现:
//有限制的复制字符串char *Strncpy(char *dest,const char *src,int n){if (dest == NULL || src == NULL){return NULL;}char *str1 = dest;while (n--){if (*src == 0){*str1++ = 0;continue;}*str1++ = *src++;}return dest;}
作用及返回值:将src指向的字符串前n个字符保存到dest指向的空间,如果该字符串长度不足n,则以'\0'填充dest指向的空间直到复制完n个字节。要求dest指向的空间不小于n个字节。返回dest,dest或src指向空,返回空。


4、字符串连接(strcat)
函数原型:
char *strcat(char *dest,const char *src);
我的实现:
//连接字符串char *Strcat(char *dest,const char *src){if (dest == NULL || src == NULL){return NULL;}char *str1 = dest;while (*str1++);str1--;while (*str1++ = *src++);return dest;}
作用及返回值:将src指向的字符串整个保存到dest指向的字符串末尾并覆盖掉'\0',包括'\0'。要求dest指向的空间足够大,大于两个字符串长度之和,否则会发生溢出。返回dest,dest或src指向空,返回空。


5、有限制的字符串连接(strncat)
函数原型:
char *strncat(char *dest,const char *src,int n);
我的实现:
//有限制的连接字符串char *Strncat(char *dest,const char *src,int n){if (dest == NULL || src == NULL){return NULL;}char *str1 = dest;while (*str1++);str1--;while (n--){if (*src == 0){*str1++ = 0;continue;}*str1++ = *src++;}*str1 = '\0';return dest;}
作用及返回值:将src指向的字符串前n个字符保存到dest指向的字符串末尾并覆盖掉'\0',然后在末尾加上'\0'。如果src指向的字符串长度不足n,则以'\0'填充dest指向的空间直到复制完n个字节。要求dest指向的空间足够大,大于dest指向的字符串长度与n之和,否则会发生溢出。返回dest,dest或src指向空,返回空。


6、字符串比较(strcmp)
函数原型:
int strcmp(const char *str1,const char *str2);
我的实现:
//比较字符串int Strcmp(const char *str1,const char *str2){if (str1 == NULL || str2 == NULL){return FALSE;}do{if(*str1 != *str2){return *str1 - *str2;}}while(*str1++ && *str2++);return 0;}
作用及返回值:让str1指向的字符串与str2指向的字符串逐个字符比较其ASCII码值,相等则继续往后比较,直到比较到不相等或其中一个字符为'\0'。返回最后比较的两个字符的差值(也可以其他实现方法)。如果相等,返回值为0,如果str1大于str2,则返回小于127的正数,如果str1小于str2,则返回大于-127的负数。str1或sre2指向空,返回FALSE(可以定义一个大于126或小于-126的宏)。


7、有限制的字符串比较(strncmp)
函数原型:
int strncmp(const char *str1,const char *str2,int n);
我的实现:
//有限制的比较字符串int Strncmp(const char *str1,const char *str2,int n){if (str1 == NULL || str2 == NULL){return FALSE;}while(n--){if(*str1 != *str2){return *str1 - *str2;}if(!(*str1++ && *str2++)){return 0;}}return 0;}
作用及返回值:让str1指向的字符串与str2指向的字符串逐个比较前n个字符的ASCII码值,相等则继续往后比较,直到比较到不相等或其中一个字符为'\0'或者第n个字符。返回最后比较的两个字符的差值(也可以其他实现方法)。如果相等,返回值为0,如果str1大于str2,则返回小于127的正数,如果str1小于str2,则返回大于-127的负数。str1或sre2指向空,返回FALSE(可以定义一个大于126或小于-126的宏)。


有关更多字符串函数的知识,希望和大家一起讨论分享。
原创粉丝点击