注意的函数
<h2>strncpy()</h2>
<p>原型:
<code>char *strncpy(char *dest, const char *src, int n)</code></p>
<p>返回值:
dest 字符串起始地址</p>
<p>说明:
1、当 src 字符串长度小于 n 时,则拷贝完字符串后,剩余部分将用空字节填充,直到 n 个 --- 带结束字符</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8092192bea4ef9f279959b7a7285bdfb&amp;file=file.png" alt="" /></p>
<p>2、当 src 长度大于等于 n 时,相当于 <code>memcpy</code>,不会自动追加结束字符,需要手动保障 --- 需要注意</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f2c8df4749a87748fe842a09869bfe0e&amp;file=file.png" alt="" /></p>
<p>3、src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 n 个字符</p>
<h2>strtok_r()</h2>
<p>原型:
<code>char *strtok_r(char *str, const char *delim, char **saveptr)</code></p>
<p>返回值:</p>
<p>说明:
1、会影响原始字串,需要注意避免影响
2、是线程安全的,因为它使用了一个额外的指针参数 saveptr 来保存分割状态
3、对于 21--22 字串,如果按照 - 来切分,得到的结果是 21 和 22。因为第二次调用 strtok_r 时的字串内容是 -22,所以按照 -22 来切分,此时得到的是 22,因为会忽略第一个空的元素。简化来看:对于 -21 字串,按照 - 来切分,得到的就是 21
4、对于 21- 和 21 字串,根据 - 进行切割得到的结果是一样的,无法识别到非法格式</p>
<h2>strtoul()</h2>
<p>原型:
<code>unsigned long int strtoul(const char *str, char **endptr, int base)</code></p>
<p>返回值:
返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。</p>
<p>说明:
1、会自动跳过前面的空格
2、支持前面有 + 或 - 号
3、注意:扫描时遇到第一个非数字或字母的字符为止,例如:对于 22hello 会得到 22
4、失败返回 0
5、经过测试,endptr 自身不会为 NULL,其指向的内容可能为空</p>
<h2>realloc()</h2>
<p>原型:
<code>void *realloc(void *ptr, size_t size)</code></p>
<p>返回值:
返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。</p>
<p>说明:
1、成功:忽略老指针,用新指针即可
2、失败:老指针还可以用</p>
<p>注意:
1、realloc 可能会导致内存基地址变化,检查是否有依赖项
2、第 2 个参数为 0 时,为释放内存
3、如果传入的第一个指针参数为NULL,则该函数等同与malloc函数。</p>
<h2>fgets()</h2>
<h2>localtime()</h2>
<p><code>localtime()</code> 不是信号可重入函数,里面用了锁,如果多线程和信号处理中都使用了此函数,可能导致死锁。另外,由于localtime 使用了锁机制,如果多线程过多调用,会导致性能问题。</p>