strcpy是“拷贝字符串”,memset是“按字节填充内存”。
strcpy:复制字符串
函数原型是:
char *strcpy(char *dest, const char *src);作用:把src字符串复制到dest里面,包括最后的\0。
例子:
#include <stdio.h> #include <string.h> int main() { char arr[20]; strcpy(arr, "hello"); printf("%s\n", arr); return 0; }结果:
hello这里arr里面实际存的是:
'h' 'e' 'l' 'l' 'o' '\0'所以strcpy适合处理字符串。
memset:把一块内存全部设置成某个字节
函数原型大概是:
void *memset(void *ptr, int value, size_t num);作用:从ptr开始,把后面num个字节都设置成value。
例子:
#include <stdio.h> #include <string.h> int main() { char arr[20]; memset(arr, 0, sizeof(arr)); return 0; }这句的意思是:
memset(arr, 0, sizeof(arr));把arr这 20 个字节全部清零。
所以memset常用于:
memset(arr, 0, sizeof(arr)); // 清空字符数组 memset(buf, 0, sizeof(buf)); // 清空缓冲区 memset(dp, -1, sizeof(dp)); // 算法里初始化数组为 -13. 最大区别
对比 |
|
|
|---|---|---|
作用 | 复制字符串 | 填充内存 |
处理对象 | 字符串 | 任意内存 |
是否关心 | 关心,遇到 | 不关心,按字节数量填 |
第三个参数 | 没有 | 填多少个字节 |
常见用途 | 把 | 清零、初始化数组 |
4. 对比例子:很关键
strcpy
char arr[20]; strcpy(arr, "abc");结果类似:
arr: a b c \0 ? ? ? ? ...它只复制"abc"和最后的\0。
memset
char arr[20]; memset(arr, 'A', sizeof(arr));结果是:
arr: A A A A A A A A A A A A A A A A A A A A它不管字符串结束符,只负责填 20 个字节。
如果你这时候:
printf("%s\n", arr);可能出问题,因为里面没有\0,它不知道字符串在哪里结束。
memset(arr, 0, sizeof(arr))为什么常见?
因为字符数组清零之后,全是:
'\0' '\0' '\0' '\0' ...这时候它天然就是一个空字符串。
char arr[20]; memset(arr, 0, sizeof(arr)); printf("%s\n", arr);输出为空,不会乱跑。
memset是按字节填
这个要特别注意 ⚠️
int arr[10]; memset(arr, 1, sizeof(arr));你可能以为每个 int 都变成1,但不是。
因为memset是按字节填充,把每一个字节都填成0x01。
一个int通常 4 字节,所以每个 int 变成:
0x01010101十进制是:
16843009所以初始化int数组时:
memset(arr, 0, sizeof(arr)); // 可以 memset(arr, -1, sizeof(arr)); // 通常可以 memset(arr, 1, sizeof(arr)); // 不建议,结果不是每个元素为 1strcpy:string copy,字符串复制 memset:memory set,内存设置更直观一点:
strcpy(arr, "hello");意思是:
把 hello 这个字符串放进 arrmemset(arr, 0, sizeof(arr));意思是:
把 arr 这块内存全部刷成 0最常用搭配就是:
char arr[100]; memset(arr, 0, sizeof(arr)); // 先清空 strcpy(arr, "hello"); // 再放字符串