C++读取字符的方式(一)

字符读取似乎有很多种方法,本人近期在学习C++的时候,将自己所了解到的读取字符的方式进行了归纳,如有错误,希望指正。

读取字符的方式就我所了解到的有scanf、getchar、cin、getline、get及其重载形式。

目录

1、scanf函数

   (1)   情景一:执行一次scanf

 (2)情景二:执行两次scanf

 (3)执行三次scanf

 (4)执行四次scanf


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)步相同。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值