记录一些可爱的C函数,例如很容易搞混的strcat、s_strcat~
字符串操作
输入
函数 | 标准 | 保留换行符 | 动态分配内存 | 说明 |
---|---|---|---|---|
scanf | N | N | 读取’\x00’不截断,但截断’\x09’, ‘\x0a’, ‘\x0b’, ‘\x0c’, ‘\x0d’, ‘\x20’ | |
gets | N | N | C11已弃用,极度危险,能读’\x00’ | |
fgets | C99 | Y | N | 最多输入n-1个字符并添加结束符,性能不佳 |
getline | TR 24731-2 | Y | N | 传入堆空间,若输入超过指定长度则使用relloc调整大小,返回读到的字符数 |
gets_s | C11 | N | N | 最多输入n-1个字符并添加结束符,成功返回字符串地址,在遇到结束标志或者其他错误时返回NULL并设buf为空串、清除输入流直到下一个换行符 |
### 拼接 | ||||
函数 | 标准 | 保证空字符结尾 | 可能截断 | 动态分配内存 |
— | — | — | — | — |
strcat | C99 | N | N | N |
strncat | C99 | N | Y | N |
strlcat | OpenBSD | Y | Y | N |
strcat_s | C11 | Y | N | N |
strncat_s | C11 | Y | N | N |
### 复制 | ||||
函数 | 标准 | 保证空字符结尾 | 可能截断 | 动态分配内存 |
— | — | — | — | — |
strcpy | C99 | N | N | N |
strncpy | C99 | N | Y | N |
strlcpy | OpenBSD | Y | Y | N |
strdup | TR24731-2 | Y | N | Y |
strndup | TR24731-2 | Y | Y | Y |
strcpy_s | C11 | Y | N | N |
strncpy_s | C11 | Y | N | N |