1. 程式人生 > >常用字串處理函式總結

常用字串處理函式總結

      我們學習過C語言的都肯定用過標頭檔案裡的函式,例如strlen, strcmp, strcpy, strcat, strtok它們是使用字元陣列時的常用函式。除此之外,還有常用的itoa和atoi函式。。。      今天,我們就逐一實現這些庫函式。      函式原型:size_t strlen(const char *str);             計算但不包括終止空字元\0的字串str的長度。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include#includeint Mystrlen(constchar *str) 
{
    assert(str != 
NULL);
    
    
int count = 0;
    
while(*str != NULL)
    {
        count++;
        str++;
    }
    
    
return count;
}
函式原型:int strcmp(const char *str1, const char *str2);        比較字串str1與str2大小。兩個字串的每個字元依次比較,若字元值(ASCII碼)差不等於0,返回差值,否則比較下個字元,直到遇到\0。注意:要比較的字元包括字串結束標誌'\0',而且一旦遇到'\0'就結束比較,無論n是多少,不再繼續比較後邊的字元。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Mystrcmp(constchar *str1, constchar *str2)
{
    assert(str1 != 
NULL);
    assert(str2 != 
NULL);
    
    
int num = 0;
    
while((num=*str1-*str2)==0 && *str1!='\0')
    {
        str1++;
        str2++;
    }
    
    
return num;
}
函式原型:int Mystrcmp(const char *str1, const char *str2, size_t n); 比較字串str1與str2前n個位元組大小。包括\n  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Mystrncmp(constchar *str1, constchar *str2, int n){     assert(str1!=NULL  && str2!=NULL); int num = 0;
    
int i = 0;
    
while((num=*str1-*str2)==0 && (i'\0'&&*str2!='\0'))
    {
        i++;
        str1++;
        str2++;
    }
    
    
return num; 
}

函式原型:char *Mystrcpy(char *dest, const char *src); 將src地址開始且含有\0結束符的字串複製到以dest開始的地址空間,返回值型別為char *。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
char *Mystrcpy(char *dest, constchar *src)
{
    assert(src!=
NULL && dest!=NULL);
    
    
char *p = dest;
    
while(*dest++ = *src++);
    
    
return p;
}

函式原型:char *Mystrncpy(char *dest, const char *src, size_t n); 把src指向的字串的前n個位元組複製到dest所指的陣列中,返回dest。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
char *Mystrncpy(char *dest, constchar *src, int n)
{
    assert(dest!=
NULL && src!=NULL);
    
    
int i = 0;
    
for(; src[i]!='\0'&&i
    {
        dest[i] = src[i];
    }
    dest[i] = 
'\0';
    
    
return dest;
}

函式原型:char *Mystrcat(char *dest, const char *src); 把src所指的字串新增到dest的結尾處(覆蓋dest結尾處的\0)  C++ Code 
1
2
3
4
5
6
7
8
9
10
char *Mystrcat(char *dest, constchar *src)//追加src指向的字串到dest指向的字串的結束。
{
    assert(dest!=
NULL && src!=NULL);
    
    
char *p = dest;
    
for(; *dest != '\0'; dest++);
    
while(*dest++ = *src++);
    
    
return p;
}
函式原型:int Myatoi(const char *str) atoi (表示 ascii to integer)是把字串轉換成整型數的一個函式. atoi( ) 函式會掃描引數str字串,跳過前面的空白字元(例如空格,tab縮排等.),直到遇上數字或正負符號才開始做轉換,而在遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。如果 str不能轉換成 int 或者 str為空字串,那麼將返回 0 。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int Myatoi(constchar *str)//"123a" -->123; "-1234" -->-1234; "a123" -->0; "  12" -->12.
{
    
int flag = 1;
    
int num = 0;
    
while(*str == ' ')
    {
        str++;
    }
    
if(*str == '-')
    {
        flag = -flag;
        str++;
    }
    
elseif(*str == '+')
    {
        str++;
    }
    
    
while(isdigit(*str))
    {
        num = 
10*num + *str - '0';  
        str++;
    }
    
    
return num*flag;
}
函式原型:char *Myitoa(int value, char *string, int radix); 將任意數字value(正數或者負數)轉化為字串string。radix為轉換字串時的基數,不一定是十進位制。 value是轉化的數字, string是字串的地址。 radix則指的是數字由十進位制轉化成radix進位制,再轉為字串。。 !!這裡需要我們注意的是,由於此程式的字元索引表只能有36個值,所以僅限2-36進位制之間的轉換。。。  C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

char *Myitoa(int num, char *str, int radix)//123 -->"123", -123 -->"-123".
{
    
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
int i = 0;
    
int k = 0;
    
    
if(num<</span>0)
    {
        num = -num;
        str[i++] = 
'-';
    }
    
do{
        str[i++] = index[num%radix];
        num /= radix;
    }
while(num != 0);
    str[i] = 
'\0';
    
if(str[0] == '-')
    {
         k = 
1;
    }
    i--;
    
    
for(int j = k; j <= (i-k)/2; j++,i--)
    {
        
char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
    }
    
    
return str;
}