C中的字符串函数
讲讲C库中的字符串函数需要特别注意的地方
memset()
这个函数我们一般用来初始化一段内存空间,将已开辟内存空间 s 的首 n 个字节的值设为值 c。(注意:会去修改内存得值,如果内存是只读,使用memset会出错)
1 |
|
需要特别注意:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。
1 |
|
如果你运行这段代码你会发现其不会输出1,这是因为memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。。
因为int是4个字节,因此再int类型中1的表现形式为“00000000000000000000000000000001”,然后将这32位填充1个byte中,高位被舍弃,也就是“00000001”,然后再填充一次就变成“0000000100000001”。那么array[0]其实在内存中存储的就是“00000001000000010000000100000001”。
解决方法
将int a
改成char a
来解决问题。
memmove()和memcpy()
1 |
|
这两个函数非常类似,但是我们在使用时最好有线使用memmove(),因为其更加安全。
如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
总结
memmove()和memcpy(),优先使用memmove()
sizeof()和strlen()
这两者的比较,首先在于sizeof()并非一个函数,而是一个操作符,但是strlen()是一个函数。
其次sizeof()所计算的时类型的长度,而strlen()所计算的是变量的长度。
sizeof()会将字符串末尾的'0'
计算进来,但是strlen()只会截止到\0
,并且不会将\0
算作一个字符
1 |
|
其会输出1
,既不是2,也不是3