字符串基本操作篇
字符串的操作对于初学者(me too)来说是必然要掌握的,再这里主要是要把握数组越界问题。还有就是'\0' 的ASCII就是等于0.
#define '\0' 0
#define NULL 0
所以在使用while循环时可以不用判断是否为'\0',或者NULL.
在这些函数中有一个规律就是当你直接通过指针自加自减操作时使用while循环要明显的简洁点。当要通过数组下标如i,j等操作时用for循环要显得清楚。
1 int strcmp(const char* str1,const str2) 字符串比较函数,如果相等则为0,str1 > str2 则返回大于0的数,如果str1 < str2 则返回小于0的数
int strcmp(const char *s1,const char *s2) //因为里面内部实现是不需要修改指针指向的内容。所以通过const 修饰
{
assert( s1 != NULL && s2 != NULL );//如果是NULL的情况会出现断错误
while( (*s1 - *s2) == 0 && *s1 != '\0' )
s1++,s2++;
return *s1 - *s2;
}
不过本人更加喜欢
int strcmp(const char *s1,const char *s2)
{
assert( s1 != NULL && s2 != NULL );
int temp = 0;
while( (temp = *s1 - *s2++) == 0 && *s1++ != '\0' );
return temp;
}
2 char* strcpy(char* dest,const char* scr) 这个函数在面试题目中经常出现就是小心dest的范围
char* strcpy(char* dest,const char* scr)
{
assert (dest != NULL && scr != NULL);
char *d = dest;
while( *d++ = *scr++ );
return dest;
}
3 char* strncpy(char* dest,const char* src,size_t n) 就是比strcpy 多了个范围
char* strncpy(char* dest,const char* src,size_t n)
{
assert(dest != NULL && src != NULL);
char* d = dest;
while(n-- && ( *d++ = *src++ ) );//n-- 放前面
return dest;
}
4 char * strcat(char *dest,const char *src) 字符串连接
char* strcat(char* dest,const char* src)
{
assert(dest != NULL && src != NULL);
char* d = dest + strlen(dest);
while( *d++ = *src++ ) ;
return dest;
}
5 int strlen(const char *s)字符串长度函数
int strlen(const char* s)
{
const char* src=s;
while(*s++);
return s - src - 1;
}
6 char* strchr(const char *s,int c) 搜索字符串中指定的字符
char* strchr(const char* s,int c)
{
assert(s != NULL);
while(*s)
{
if(*s == (char )c)
return s;
s++;
}
return NULL;
}
7 char* strrchr(const char *s,int c) 搜索字符串中指定字符最后出现的位置这里的字符类型是int。这个要小心点要同过强制类型转换来达到目的
char* strrchr(const char* s,int c)
{
assert(s != NULL);
char* ptr=NULL;
while( *s )
{
if( *s == (char )c )
ptr = s;
s++;
}
return ptr;
}
8 size_t strspn(const char* str,const char* accept) 测试一个字符串是否包括另一个字符串中的元素,返回第一个不在给定字符串中的字符下标,这个实现太巧妙了,这种方法可以用于局部数据的排序,还有这里的测试特定(局部数据)的数组下标是否出现过,通常都是通过2个循环来达到双重循环的效果。
size_t strspn(const char* str,const char* accept)
{
int i,a[256] = {0};
for(i = 0;accept[i] != '\0';i++)
a[accept[i]] = 1;
for(i = 0;str[i] != '\0';i++)
if(a[str[i]] != 1)
break;
return i;
}
9 char* strstr(const char* str, const char* substr) 测试一个字符串中第一次出现子串的位置。。通过指针的自加和数组下标的完美配合来实现
char* strstr(const char* str, const char* substr)
{
int j = 0;
while(*str != '\0')
{
for(j=0;substr[j] != '\0';j++)
if(str[j] != substr[j])
break;
if(substr[j] == '\0')
return str;
str ++;
}
return NULL;
}
10 int strncmp(const char* s1,const char* s2,size_t n) 比较前n个
int strncmp(const char *s1,const char *s2,size_t n)
{
assert(n > 0 && s1 != NULL && s2 != NULL );
int temp = 0;
while( n-- && (temp = *s1 - *s2++) == 0 && *s1++ != '\0' );
return temp;
}
11 char *strpbrk(char *str,const char *accept)这个函数的实现和strspn类似不过要简单点
char *strpbrk(char *str,const char *accept)
{
int i,a[256]={0};
for(i=0;accept[i]!='\0';i++)
a[accept[i]]=1;
for(i=0;str[i]!='\0';i++)
if(a[str[i]]==1)
return str+i;
return NULL;
}
12 strtok 还没实现,等实现了再贴出来