标签:false assert == str1 内存区域 整型 目的 转换函数 区域
函数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可以作为其他函数的实参。
函数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就退化为指针了。
函数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; }
函数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字符串。
标签:false assert == str1 内存区域 整型 目的 转换函数 区域
原文地址:https://www.cnblogs.com/wanghaiyang1930/p/9612981.html