scanf
-
遇到空格,tab,回车都会结束输入
-
string :scanf("%s",&s[0]),需要先用resize预分配空间,建议用cin
string s;
s.resize(100);//必须先预分配空间
scanf("%s",&s[0]);
cout<<s;
//printf("%s\n", s); 错误的写法
printf("%s\n", s.c_str()); //正确的写法,c_str的作用就是将C++的string转化为C的字符串(char *)数组
-
字符数组char a[]:scanf("%s",a),scanf_s("%s", str, sizeof(str))
-
与scanf函数相比,scanf_s函数多了一个参数用于指定读取的最大字符数。这个参数是为了防止缓冲区溢出而引入的,可以有效地防止一些安全性问题,建议用scanf_s
char a[20];
scanf("%s",a);
printf("%s",a);
char str[100];
scanf_s("%s", str, sizeof(str));
printf("您输入的字符串是:%s\n", str);
-
字符数组char str[2],scanf("%s",str)不会检查是否越界,scanf在遇到空白符(\n、\t…)之前一直将字符读入输入缓冲区中,超过了字符数组的长度,可能会发生非法访问以及其他未知的错误。
-
输入缓冲区有数据:从输入缓冲区读取,从非空(回车、空格、tab)字符开始,遇到空格结束(回车、空格、tab)。末尾回车会被留在输入缓冲区,并且不做处理。 输入缓冲区没有数据:获取键盘输入,当按下回车的时候,输入的数据连同刚按下的回车符被送入输入缓冲区。然后从输入缓冲区区读取数据。(cin与scanf对输入数据的处理相同)
-
读入的字符串有空格时,不建议用scanf
-
//输入:aaa bbb 输出:aaa bbb 只输入1次,scanf("%s",b)不发挥作用 char a[20]; char b[20]; scanf("%s",a); printf("%s ",a);//可改为cout scanf("%s",b); printf("%s",b); char a[20]; char b[20]; cin>>a; printf("%s ",a); cin>>b; printf("%s",b);
输入:aaa bbb 输出:aaa bbb 只输入1次,scanf("%s",b)不发挥作用
gets&puts
-
gets() 的作用是从键盘上读取字符串
-
gets() 可以接收空格、Tab键, 碰到回车键输入才结束;而scanf碰到空格、回车、Tab键 都会结束输入。
-
如果读入回车,把回车替换为\0并结束该字符串
-
puts在 输出的时候会将字符串末尾的\0'自动换成\n'
-
gets() 和scanf() 都不能检测越界。
-
读入的字符串有空格时,建议用gets
char a[20];
char b[20];
gets(a);
cout<<a<<'\n';
gets(b);
cout<<b;
getchar
-
字符输入函数,没有参数,从输入缓冲区里面读取一个字符,一次只能读取一个字符,包括回车符,所以输入密码后要先用getchar读取回车
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
-
getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束