目录
- 1.memcpy
- 2.memmove
- 3.memset
- 4.memcmp
- 5.atoi
1.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
- 这个函数再遇到\0时不会停下来
- 如果source和destination有任何的重叠,复制的结果都是未定义的(也就是说memcpy函数最好在两个不同的数组之间拷贝)
int main() {int a[] = { 1,2,3,4,5 };int b[10] = { 0 };memcpy(b, a, 20);for (int i = 0; i < 10; i++) {printf("%d ", b[i]);}
}
模拟实现
void my_memcpy(void* b, const void* a, int n) {assert(a && b);while (n--) {*(char*)b = *(char*)a;b = (char*)b + 1;a = (char*)a + 1;}*(char*)b = '\0';
}
int main() {char a[] = "Hello";char b[100];int n = 5 * sizeof(a[0]);my_memcpy(b, a, n);printf("%s\n", b);return 0;
}
注意count时字节数,因为memcpy函数的第三个参数是需要复制的字节数,因为int类型的字节数时4个字节,所以需要复制5个元素的话就需要20个字节。
2.memmove
void * memmove ( void * destination, const void * source, size_t num );
-
memmove和memcpy都是起到的复制的作用,不同点是memmove函数可以处理的原内存块和目标内存的块是可以重叠的
-
如果要处理的原空间和目标空间出现重叠,那么必须使用memmove函数进行处理
int main() {int a[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(a + 2, a, 20);for (int i = 0; i < 10; i++) {printf("%d ", a[i]);}return 0;
}
3.memset
void * memset ( void * ptr, int value, size_t num );
- memset函数是用来设置内存的,将内存中的值以字节为单位设置为想要的内容
- memset函数最好不处理多字节的数据类型,比如int, double, long……
int main() {char a[] = "Hello, Paisi";memset(a, 'x', 5);printf("%s\n", a);return 0;
}
4.memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
- memcmp函数的作用时比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
- 如果ptr1 < ptr2, 则返回小于0的数
- 如果ptr1 > ptr2,则返回大于0的数
- 如果两个指针相等,则返回0
- 比较的是对应位置上的ASCII码值的大小
int main() {char a[] = "Hello, Paisi";char b[] = "Hello, paisi";int ret = memcmp(a, b, sizeof(a));printf("%d\n", ret);return 0;
}
5.atoi
int atoi (const char * str);
- atoi函数是用于将字符串转换为整数。它的名字是 “ASCII to Integer” 的缩写。这个函数定义在 <stdlib.h> 头文件中。
#include <stdio.h>
#include <stdlib.h> int main() { const char *str = "12345"; int number = atoi(str); printf("The number is: %d\n", number); return 0;
}
模拟实现
int my_atoi(const char* a) {int sign = 1;//定义正负号int result = 0;//去除空白字符while (isspace(*a)) {a++;}//处理符号if (*a == '-') {sign = -1;a++;}else if (*a == '+') {a++;}//处理数字while (isdigit(*a)) {int digit = *a - '0';//将数字字符转化为数字只需要减去字符0,因为ASCII码相减就是数字result = result * 10 + digit;a++;}return sign * result;
}
int main() {char a[] = "12345";int ret = my_atoi(a);printf("%d\n", ret);return 0;
}