重写基础函数
1. 字符串拷:strcpy()
函数strcpy的原型是char* strcpy(char* des , const char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
char* strcpy( char* dst, const char* src ) {assert( NULL != dst && NULL != src );char* rtn = dst;while ( (*dst++ = *src++) != '\0' ) {}return rtn; }
1) 最后拷贝了结束符’\0’;
2)源指针应该声明为 const 类型;
3)要判断源指针和目的指针为空的情况;
4)函数返回 char* 的目的是为了支持链式表达式,即strcpy可以作为其他函数的实参。
2. 字符串长度:strlen()
函数strlen的原型是size_t strlen(const char *s)。
size_t strlen( const char* str ) {assert( NULL != str );size_t len = 0;while ( (*str++) != '\0' ) {++len;}return len; }
1)sizeof是运算符,strlen是库函数;
2)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
3. 字符串连接:strcat()
函数strcat的原型是char* strcat(char* des, char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
char* strcat( char* dst, const char* src) {assert( NULL != dst && NULL NULL != src );char* rtn = dst;while ( *dst != '\0' ) {++dst;}while ( (*dst++ = *src++) != '\0' ) {}return rtn; }
4. 字符串比较:strcmp()
函数strcmp的原型是int strcmp(const char *s1,const char *s2)。
1)若s1==s2,返回零;
2)若s1>s2,返回正数;
3)若s1<s2,返回负数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
char * strcmp( const char* str1, const char* str2 ) {assert( NULL != str1 && NULL != str2 );while ( *str1 == *str2 ) {if ( *str1 == '\0' )break;++str1;++str2;}return *str1 - *str2; }
5. memcpy()
void* memcpy( void* dst, const void* src, size_t count ) {assert( NULL != dst && NULL != src );void* rtn = dst;while ( count-- ) {*(char*)dst = *(const char*)src;dst = (char*)dst + 1;src = (const char*)src + 1;}return rtn; }
6. memmove()
void* memmove( void* dst, const void* src, size_t count ) {assert( NULL != dst && NULL != src );void* rtn = dst;if ( dst <= src || (char*)dst >= ((const char*)src + count) ) {while ( count-- ) {*(char*)dst = *(const char*)src;dst = (char*)dst + 1;src = (const char*)src + 1;}} else {dst = (char*)dst + count - 1;src = (char*)src + count - 1;while ( count-- ) {*(char*)dst = *(const char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return rtn; }
7. atoi()
int atoi( const char* str ) {assert( NULL != str );while ( *str == ' ' || *str == '\t' || *str == '\n' ) {++str;}bool negative = false;if ( *str == '-' ) {++str;negative = true;} else if ( *str == '+' ) {++str }int rtn = 0;while ( *str >= '0' && *str <= '9' ) {rtn = rtn*10 + *str - '0';++str;}if ( negative )return -rtn;return rtn; }
8. itoa()
char* itoa( int value, char* buf, int radix ) {assert( NULL != buf );char* rtn = buf;if ( value < 0 ) {*buf++ = '-';value = -value;}char* ptr = buf;while ( value > 0 ) {int v = value % 10;v /= 10;*ptr++ = (char)value + '0'}*ptr-- = '\0';while ( buf < ptr ) {char temp = *ptr;*ptr = *buf;*buf = temp;++buf;--buf;}return rtn; }
9. 其他
在linux下没有itoa这个函数,linux下的字符转换函数只有:
atof 字符串转换到浮点型数;
atoi 字符串转换到整型数: int atoi(const char *nptr);跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
atol 字符串转换到长整型数;
ecvt 浮点型数转换到字符串,取四舍五入;
fcvt 浮点型数转换到字符串,取四舍五入;
gcvt 浮点型数转换到字符串,取四舍五入;
strtod 字符串转换到浮点型数;
strtol 字符串转换到长整型数;
strtoul 字符串转换到无符号长整型数;
toascii 将整形数转换合法的ASCII字符串。