gets(char buffer[]) 从标准输入读取一行, 并去掉换行符, 在字符串末尾增加 ‘\0‘ 字符, 写入到缓冲区
成功则返回 buffer 的地址, 出错或者遇到文件结尾则返回空指针, 使用 stdio 的 NULL 表示
fgets(char buffer[], int num, FILE * f) 从指定文件 f 中读取 num - 1 个字符, 去掉换行符, 并在末尾添加 ‘\0‘ 字符, 写入到 buffer
scanf(const char * format [, argument]) 处理字符串时, 更基于获取单词, 而不是获取字符串, 在字符串末尾增加 ‘\0‘ 字符, 如果指定了宽度, 则字符串长度为 N + 1, 停止读取字符串结束原因:
1.遇到了第一个非空白字符
2.如果指定了宽度, 读取指定宽度后停止读取
返回 EOF 或者成功读取的变量
fscanf(FILE *stream, const char *format [, argument ])
同 scanf 返回
字符串打印都是在遇到 ‘\0‘ 时停止
puts() 会自动在字符串末尾加 ‘\n‘ 换行符
fputs()
printf()
fprintf()
strcpy, ctrcat, sprintf, gets 容易造成缓冲区溢出, 罪魁祸首是不检查变量长度
gets(char *buffer) 从标准输入读取用户输入的一行文本, 它在遇到 EOF 字符或换行字符之前, 不会停止读入文本, 也就是 gets() 根本不执行边界检查, 因此, 使用 gets() 总是有可能使任何缓冲区溢出, 永远不要使用此函数, 不安全, 没有限制输入的字符个数, 如果超出 buffer 会导致程序失败, 可以使用 fgets() 函数做替代
不要使用如下代码:
char buf[1024]; gets(buf);
使用以下代码代替:
char buf[BUFSIZE]; fgets(buf, BUFSIZE, stdin);
strcpy() 将源字符串复制到缓冲区, 没有指定要复制字符的具体数目, 复制字符的数目直接取决于源字符串中的数目, 如果源字符串碰巧来自用户输入, 且没有专门限制其大小, 则有可能会陷入大的麻烦中
1.如果知道目的地缓冲区的大小, 则可以添加明确的检查
if (strlen(src) >= dst_size) { /* Do something appropriate, such as throw an error. */ } else { strcpy(dst, src); }
2.使用 strncpy() 函数
strcpy, strcat, sprintf, scanf, sscanf, fscanf, vfscanf, vsprintf, vscanf, vsscanf, streadd, strecpy, strtrns,