常用字串處理函式總結
阿新 • • 發佈:2019-02-15
我們學習過C語言的都肯定用過標頭檔案裡的函式,例如strlen, strcmp, strcpy, strcat,
strtok它們是使用字元陣列時的常用函式。除此之外,還有常用的itoa和atoi函式。。。
今天,我們就逐一實現這些庫函式。
函式原型:size_t strlen(const char *str);
計算但不包括終止空字元\0的字串str的長度。
C++ Code
函式原型:int strcmp(const char *str1, const char *str2);
比較字串str1與str2大小。兩個字串的每個字元依次比較,若字元值(ASCII碼)差不等於0,返回差值,否則比較下個字元,直到遇到\0。注意:要比較的字元包括字串結束標誌'\0',而且一旦遇到'\0'就結束比較,無論n是多少,不再繼續比較後邊的字元。
C++ Code
函式原型:int Mystrcmp(const char *str1, const char *str2,
size_t n);
比較字串str1與str2前n個位元組大小。包括\n
C++ Code
函式原型:char *Mystrcpy(char *dest, const char *src); 將src地址開始且含有\0結束符的字串複製到以dest開始的地址空間,返回值型別為char *。 C++ Code
函式原型:char *Mystrncpy(char *dest, const char *src, size_t n); 把src指向的字串的前n個位元組複製到dest所指的陣列中,返回dest。 C++ Code
函式原型:char *Mystrcat(char *dest, const char *src); 把src所指的字串新增到dest的結尾處(覆蓋dest結尾處的\0) C++ Code
函式原型:int Myatoi(const char *str)
atoi (表示 ascii to integer)是把字串轉換成整型數的一個函式. atoi( )
函式會掃描引數str字串,跳過前面的空白字元(例如空格,tab縮排等.),直到遇上數字或正負符號才開始做轉換,而在遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。如果
str不能轉換成 int 或者 str為空字串,那麼將返回 0 。
C++ Code
函式原型: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 |
#include#includeint Mystrlen(constchar *str) { assert(str != NULL); int count = 0; while(*str != NULL) { count++; str++; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int Mystrcmp(constchar *str1, constchar *str2) { assert(str1 != assert(str2 != NULL); int num = 0; while((num=*str1-*str2)==0 && *str1!='\0') { str1++; str2++; } return num; } |
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; } |
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; } |
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; } |