我们学习过C语言的都肯定用过头文件里的函数,例如strlen, strcmp, strcpy, strcat, strtok它们是使用字符数组时的常用函数。除此之外,还有常用的itoa和atoi函数。。。
函数原型:
int strcmp(const char *str1, const char *str2);
函数原型:
int Myatoi(const char *str)
函数原型:
char *Myitoa(int value, char *string, int radix);
今天,我们就逐一实现这些库函数。
函数原型:
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
#include int Mystrlen( const char *str) { assert(str != NULL ); int count = 0 ; while (*str != NULL ) { count++; str++; } return count; } |
比较字符串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(
const
char
*str1,
const
char
*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(
const
char
*str1,
const
char
*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,
const
char
*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,
const
char
*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,
const
char
*src)
//追加src指向的字符串到dest指向的字符串的结束。 { assert(dest!= NULL && src!= NULL ); char *p = dest; for (; *dest != '\0' ; dest++); while (*dest++ = *src++); return p; } |
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(
const
char
*str)
//"123a" -->123; "-1234" -->-1234; "a123" -->0; " 12" -->12. { int flag = 1 ; int num = 0 ; while (*str == ' ' ) { str++; } if (*str == '-' ) { flag = -flag; str++; } else if (*str == '+' ) { str++; } while (isdigit(*str)) { num = 10 *num + *str - '0' ; str++; } return num*flag; } |
将任意数字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; } |