C/C++ scanf和gets 区别 , printf和puts区别
ref
1. scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢?
不同点:
scanf 留回车:开头忽略所有空格,以空格、制表符Tab(\r)、换行符(\n)等结束,结尾自动加上'\0',并且这些字符会留在缓冲区中;
#include <stdio.h> int scanf(const char *format, ...);
scanf <=>fscanf(stdin, ...);
gets 吃回车:开头接受任何字符,以换行符结束,并且会用'\0' 替换换行符作为字符串结尾.
因为gets不能告知缓冲区大小, 很容易造成缓冲区溢出, 因此, gets弃用, 取而代之的是fgets
#include <stdio.h> char *gets(char *s); char *fgets(char *s, int size, FILE *stream);
char buf[MAXSIZE];
gets(buf); => fgets(buf, MAXSIZE, stdin);
相同点:
字符串结尾自动加'\0', 以确保null终结符.
scanf和gets搭配混用时,需要注意是否接收空格、Tab、换行等特殊字符。
比如,为避免在scanf之后,出现输入的换行被scanf忽略,但是会被gets接收的问题,可以在gets前添加一个getchar,用于专门接收缓冲区的换行字符
int main() { int n; char b[200]; scanf("%d", &n); // 输入n getchar(); //scanf 之后, gets之前需要添加一个getchar , 否则下一个gets会将输入的回车作为b的新输入 gets(b); }
2. printf和puts都可以输出字符串到stdout,那么它们有什么区别?
1) 末尾null字符(\0)
puts会自动将字符串末尾的\0转换为\n输出,而printf则不会。
2) 参数
printf可以使用格式化字符串, 支持不定参数; 而puts只能输出一个固定的字符串, 不支持格式字符串.