字串基本操作篇
字串的操作對於初學者(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 還沒實現,等實現了再貼出來