C中的字符串函数

讲讲C库中的字符串函数需要特别注意的地方

memset()

这个函数我们一般用来初始化一段内存空间,将已开辟内存空间 s 的首 n 个字节的值设为值 c。(注意:会去修改内存得值,如果内存是只读,使用memset会出错)

1
void memset(void* s ,int c, size_t n)

需要特别注意:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。

1
2
3
4
int arr [10];
int a = 1;
memset(arr,a,10);
pritnf("%d\n",arr[0]);

如果你运行这段代码你会发现其不会输出1,这是因为memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。

因为int是4个字节,因此再int类型中1的表现形式为“00000000000000000000000000000001”,然后将这32位填充1个byte中,高位被舍弃,也就是“00000001”,然后再填充一次就变成“0000000100000001”。那么array[0]其实在内存中存储的就是“00000001000000010000000100000001”。

解决方法

int a改成char a来解决问题。

memmove()和memcpy()

1
2
void *memmove(void *str1, const void *str2, size_t n)
void *memcpy(void *dest, const void *src, size_t n)

这两个函数非常类似,但是我们在使用时最好有线使用memmove(),因为其更加安全。

如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

总结

memmove()和memcpy(),优先使用memmove()

sizeof()和strlen()

这两者的比较,首先在于sizeof()并非一个函数,而是一个操作符,但是strlen()是一个函数。

其次sizeof()所计算的时类型的长度,而strlen()所计算的是变量的长度。
sizeof()会将字符串末尾的'0'计算进来,但是strlen()只会截止到\0,并且不会将\0算作一个字符

1
2
char arr [3] = {1,0,2};
printf("%d\n",strlen(arr));

其会输出1,既不是2,也不是3


C中的字符串函数
https://ysc2.github.io/ysc2.github.io/2023/11/09/C中的字符串函数/
作者
Ysc
发布于
2023年11月9日
许可协议