记录一些可爱的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 |