字符读取似乎有很多种方法,本人近期在学习C++的时候,将自己所了解到的读取字符的方式进行了归纳,如有错误,希望指正。
读取字符的方式就我所了解到的有scanf、getchar、cin、getline、get及其重载形式。
目录
1、scanf函数
函数声明:scanf(char const* const _Format , ...)
使用方法:scanf("%d" , &input); //%d 读取一个十进制的数
scanf("%s" , &input); //%s——读取一个字符串
作用:读取键盘输入的内容,将其赋值给input
特点:scanf遇到空格" "或者换行符\n(回车键)便停止读取,但是会保留换行符\n
补充:
(1)情景一:执行一次scanf
为了后面方便介绍,这里提前补充一下,下面以一段代码说明
#include <stdio.h>
int main()
{
char input[20] = {0};
printf("请输入内容: ");
scanf("%s",input); //假设这里输入Tom Jack# Lucy,然后回车
printf("%s",input);
return 0;
}
scanf第一次执行的时候,无论是否遇到空格都会读取全部内容,直至遇到‘\n’停止 ,读取的内容会暂时被放到输入缓冲区
然后再从缓冲区中开始逐个读取,放到数组input中,遇到空格或者换行符时,停止读取
所以输入Tom Jack# Lucy以后,只有Tom会被放到数组input中
文件结束的标记也会发生改变
程序运行结果如下:
(2)情景二:执行两次scanf
还是沿用刚刚的程序,只不过我们需要稍微进行修改
#include <stdio.h>
int main()
{
char input[20] = {0};
char input1[20] = {0};
printf("请输入内容: ");
scanf("%s",input); //假设这里输入Tom Jack# Lucy,然后回车
scanf("%s",input1);
printf("%s",input);
printf("%s\n",input1);
return 0;
}
我们新增了一个数组,执行了两次scanf函数,然后把两个数组的内容打印出来,这次我们先来看看结果
这次我们会发现,我们只输入了一次,但是打印了不同的结果,这证实了我们前面所说的
由此我们可了解到
执行scanf之前
第一次执行scanf的时候,先全部添加到缓冲区,然后再从缓冲区读取字符放到数组input中。
第二次执行scanf的时候,从上一次结束标记的下一位开始读取,放到 数组input1中
(3)执行三次scanf
从前面的结果我们估计可以猜到接下来的结果,我们继续加
#include <stdio.h>
int main()
{
char input[20] = {0};
char input1[20] = {0};
char input2[20] = {0};
printf("请输入内容: ");
scanf("%s",input); //假设这里输入Tom Jack# Lucy,然后回车
scanf("%s",input1);
scanf("%s",input2);
printf("%s\n",input);
printf("%s\n",input1);
printf("%s\n",input2);
return 0;
}
运行结果:
现在缓冲区里应是这种情形
现在缓冲区里没有东西可读了,如果这种情况下再执行一次scanf会怎样
(4)执行四次scanf
#include <stdio.h>
int main()
{
char input[20] = {0};
char input1[20] = {0};
char input2[20] = {0};
char input3[20] = {0};
printf("请输入内容: ");
scanf("%s",input); //假设这里输入Tom Jack# Lucy,然后回车
scanf("%s",input1);
scanf("%s",input2);
scanf("%s",input3);
printf("%s\n",input);
printf("%s\n",input1);
printf("%s\n",input2);
printf("%s\n",input3);
return 0;
}
这个时候就不打印了,因为第四次执行scanf的时候发现,缓冲区里没东西了,所以在等你输入,这个时候我们输入一个'a',然后回车看看结果
总结:
(1)第一次执行scanf的时候,无论是否包含空格,都会先读到输入缓冲区,遇到回车停止。
然后再从缓冲区读取内容存放到数组,这个时候才是遇到空格或者回车就停止读取。
(2)第二次执行scanf的时候,会从缓冲区中上一次结束的地方开始读取,然后将读取到的内容存放到数组
(3)当缓冲区中无内容的时候,scanf会等待输入,并读到缓冲区。这时的操作和第(1)步相同。