scanf一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而scanf函数直接从输入缓冲区中读取数据。正因为scanf函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,scanf函数会直接取得这些残留数据而不会请求键盘输入,例如:Scanf(“%c”,&a);scanf(“%c”,&b);则第二个scanf读入的是换行。
Scanf(“%s”,a);scanf(“%c”,&b);第二个scanf读入的依然是换行。
Scanf(“%d”,&a);scanf(“%c”,&b);第二个scanf读入的依然是换行。
而scanf读入字符串时会将换行符丢弃。例如:scanf(“%s”,a);scanf(“%s”,b),输入hello(换行)world!(换行),输出查看结果发现hello world!。
gets会丢弃回车符。
注意scanf接收字符与接收字符串的区别。scanf接收字符串总是不会接受换行
Scanf(“%c”,&a);
Printf(“%c”,a);
Scanf(“%s”,b);
Printf(“%s”,b);
输入:
a(换行)
Hello
输出:
a
Hello
Scanf(“%c”,&a);
Printf(“%c”,a);
gets(b);
Printf(“%s”,b);
输入:
a(换行)
输出:
a
(换行)
原因:换行符留在缓冲区被gets接收
Scanf(“%s”,a);
Printf(“%s\n”,a);
Gets(b);
Printf(“%s\n”,b);
输入:
Hello(换行)
输出:
Hello
(换行)
原因:scanf丢弃换行,留在缓冲区,被gets接收
cin下次再总结