开此贴总结一下C中的字符串操作函数,及其实现。此前看到网上有总结者,但有许多错误和重复,我在此基础上重新总结一下,并加上其实现的代码。如有错误请大家指正,共同学习。
1.函数名: strcpy
功 能: 拷贝一个字符串到另一个
用 法: char *strcpy(char *destin, const char *source);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%sn", string);
return 0;
}
输出:abcdefghi
实现:
char* strcpy(char* dst,const char* src)
{
assert((dst!=NULL)&&(src!=NULL));
char* address=dst;
while ((*dst++=*src++)!='/0');
return address;
}
2.函数名: strncpy
功 能: 串拷贝
用 法: char *strncpy(char *dst, const char *src, int n);
程序例:
int main(void)
{
char str[10];
char *str1 = "abcdefghi";
strncpy(str, str1, 3);
string[3] = '/0';
printf("%s/n", str);
return 0;
}
输出:abc
代码:
char* strncpy(char* dst,const char* src,int n)
{
//assert((dst!=NULL)&&(src!=NULL));
char* address = dst;
while ((n-- >0)&&((*dst++=*src++)!=NULL));
return address;
}
3.函数名: strdup
功 能: 将串拷贝到新建的位置处, 所需空间由malloc()分配且可以由free()释放。
用 法: char *strdup(const char *src);
程序例:
int main(void)
{
char *dup_str, *string = "abcde";
dup_str = strdup(string);
printf("%sn", dup_str);
free(dup_str);
return 0;
}
输出:abcde
实现:
char* strdup(const char* src)
{
//assert(src!=NULL);
size_t len=strlen(src)+1;
char* temp=(char*)malloc(len*sizeof(char));
if (temp==NULL)
{
return NULL;
}
memcpy(temp,src,len);
return temp;
}
4.函数名: strcat
功 能: 把src所指字符串添加到dest结尾处(覆盖dest结尾处的'/0')并添加'/0'。
用 法: char *strcat(char *dst, char *src);
程序例:
int main(void)
{
char destination[25]={0};
char *blank = " ", *c = "C++", *Borland = "Borland";
strcat(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%sn", destination);
return 0;
}
输出:Borland C++
代码:
char* strcat(char* dst,const char* src)
{
//assert((dst!=NULL)&&(src!=NULL));
char* temp=dst;
while (*dst!=NULL)
dst++;
while ((*dst++=*src++)!=NULL);
return temp;
}
5.函数名: strcmp
功 能: 串比较,看Asic码,str1>str2,返回值 > 0;两串相等,返回0
用 法: int strcmp(const char *first, const char *last);
程序例:
int main(void)
{
char *buf1 = "aaa", *buf2 = "bbb";
int ptr;
ptr = strcmp(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
else
printf("buffer 2 is less than buffer 1n");
return 0;
}
输出:
buffer 2 is greater than buffer 1
实现:
int strcmp ( const char* first, const char* last )
{
int ret = 0 ;
while( ! (ret = *(unsigned char *) first - *(unsigned char *) last) && * last)
++ first, ++ last;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
6.函数名: strncmp
功 能: 串比较
用 法: int strncmp(char * first, char * last, int count);
程序例:
int main(void)
{
char *buf1 = "bbbaaa", *buf2 = "bbbccc";
int ptr;
ptr = strncmp(buf2,buf1,3);
if (ptr > 0)
printf("buf2 is greater than buf1/n");
else if(ptr<0)
printf("buf2 is less than buf1/n");
else
printf(“buf2 equals to buf1/n”);
ptr = strncmp(buf2,buf1,4);
if (ptr > 0)
printf("buf2 is greater than buf1/n");
else if(ptr<0)
printf("buf2 is less than buf1/n");
else
printf(“buf2 equals to buf1/n”);
return(0);
}
输出:
buf2 equals to buf1
buf2 is greater than buf1
实现:
int strncmp (const char * first,const char * last,size_t count)
{
if (!count)
return(0);
while (--count && *first && *first == *last)
{
first++;
last++;
}
return( *(unsigned char *)first - *(unsigned char *)last );
}
7.函数名: stricmp strcmpi
功 能: 比较两个字符串, 不区分大小写
用 法: int strcmpi(char *str1, char *str2);
程序例:
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1/n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1/n");
if (ptr == 0)
printf("buffer 2 equals buffer 1/n");
return 0;
输出:
buffer 2 equals buffer 1
int strcmpi(const char * dst, const char * src)
{
int f, l;
do {
if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') )
f -= ('A' - 'a');
if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') )
l -= ('A' - 'a');
} while ( f && (f == l) );
return(f - l);
}
8.函数名: strncmpi strnicmp
功 能: 比较两个字符串的前n个字符,忽略大小写
用 法: int strncmpi(char *str1, char *str2, unsigned count);
程序例:
与strncmp类似
代码:
int strnicmp (const char * first, const char * last, size_t count)
{
int f, l;
if ( count )
{
do {
if ( ((f = (unsigned char)(*(first++))) >= 'A') &&(f <= 'Z') )
f -= 'A' - 'a';
if ( ((l = (unsigned char)(*(last++))) >= 'A') &&(l <= 'Z') )
l -= 'A' - 'a';
} while ( --count && f && (f == l) );
return( f - l );
}
return( 0 );
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/xinghui0001/archive/2010/10/07/5924542.aspx