itoa函数:
void itoa(int value, char* result, int base) {
if(strlen(result) <= 0) {
return;
}
if(base < 2 || base > 36) {
*result = '\0';
return;
}
char table[] = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz";
char* ptr1 = result, *ptr2 = result;
int temp;
do {
temp = value;
value /= base;
//注意temp - value * base有可能为负数
*ptr1++ = table[35 + temp - value * base];
} while(value);
if(temp < 0) {
*ptr1++ = '-';
}
*ptr1-- = '\0';
char c;
while(ptr1 > ptr2) {
c = *ptr1;
*ptr1-- = *ptr2;
*ptr2++ = c;
}
}
atoi函数:
int atoi(const char* c) {
int n = strlen(c);
if(n <= 0) {
return 0;
}
int p = 0;
int result = 0;
if(c[0] == '-' || c[0] == '+') {
p++;
}
while(p < n && c[p] >= '0' && c[p] <= '9') {
result = 10 * result + (c[p] - '0');
p++;
}
if(c[0] == '-') {
result = -result;
}
return result;
}
memcpy函数:
所在头文件:#include< cstring >
声明:void *memcpy(void *dest, const void *src, size_t n);
功能:从src复制n个字节的内容(可以是任意数据类型)到dest指向的内存中。
void* memcpy(void* dst, void* src, size_t n) {
if(dst == NULL || src == NULL) {
return NULL;
}
char* pDst = (char*)dst;
char* pSrc = (char*)src;
//地址重叠且源数据内存在前面
if(src < dst && (char*)src + n > (char*)dst) {
while(n >= 0) {
*(pDst + n) = *(pSrc + n);
n--;
}
} else {
for(int i = 0; i < n; i++) {
*(pDst + i) = *(pSrc + i);
}
}
return dst;
}
注意使用size_t是为了提高可移植性,比如有的size_t为long unsigned int。如果传一个负数会将符号位当成数值因此一般是一个很大的数。strcpy函数实现类似。
strstr函数:
头文件:#include < string >
声明:char* strstr(char* str1, char* str2);
功能:于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则返回NULL。
char* strstr(char* str1, char* str2) {
if(str2 == NULL) {
return NULL;
}
while(str1) {
int i = 0;
for(; *(str2 + i) != '\0'; i++) {
if(*str1 != *(str2 + i)) {
break;
}
}
if(*(str2 + i) == '\0') {
return str1;
}
str1++;
}
return NULL;
}
注意”\0”与NULL是不同的,且当str2 == NULL时需要特殊处理,否则*str2程序会挂掉。