今天本来打算早点更的,但是学的东西太多了,就一直拖到现在才开始写。。。
其实想写的东西有很多,但由于时间原因,我还是挑比较重要的写吧,废话不多说,我们开始吧!

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


前言

在我们编程的过程中,常常遇到这样一种情况,程序它要求我们一次性输入多个数据,但是很多人就会想了,当你输入回车换行的时候,程序不就开始执行了吗?而一旦执行结束,不就必须关闭程序重新执行吗?那要怎样做到输入多组数据呢?


一.Scanf中的返回值

先简单介绍一下scanf中的三种返回值,这对理解下面介绍的在scanf实现多组输入也有一定帮助。

1. 正整数,表示正确输入参数的个数。

  • 例如执行 scanf(“%d %d”, &a, &b)。

  • 输入6 6,则正确返回2(输入了两个变量)。

  • 输入3 ;4,则可以正确输入a,无法输入b,即正确返回1(输入了一个变量)

2.“0”

  • 表示用户输入不匹配,无法正确输入任何值.(比如上例输入“ a6 6”)

3.EOF

  • 这是在 stdio.h 里面定义的常量(通常值为-1),表示输入流已经结束。


二.实现在scanf中多组输入的常见方法

1.什么是多组输入

多组输入就是在你输入数据时,可多次输入数据,这几组数据分别执行并输出各组的结果,而不是一组一组的执行直到上一组结束才能重新执行程序输入下一组数据,这极大的提高了效率。


以下是几种实现的常见方法:

2.利用scanf中的返回值

1)EOF法

在scanf返回值中,EOF(end of file)表示输入流已经结束,因此我们可以通过判断scanf的返回值是否为EOF来判断是否退出循环,达到多组输入的目的。

  • 代码如下
  • 以下代码的目的是求出多组a+b+c的值
int main() 
{
    int a, b, c;
    while(scanf("%d %d %d",&a,&b,&c)!=EOF)//多组输入
    {
      printf("%d",a+b+c);  
    }  
    return 0;
    
 }    

  • 示例
    5 5 2
    12
    8 8 3
    19
  • 需要注意的地方是,在终端(黑框)中手动输入时,系统并不知道什么时候到达了我们想要的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.

2)正整数法

可以利用scanf返回值为正确返回参数的个数达到实现多组输入的目的。

  • 代码如下:
    该程序scanf函数返回的是实际读到的正确参数的个数,在这里scanf读取到的返回值为1,循环就开始执行,此时输出为a的平方。当读到的参数不为1时,循环就停止。
int main()
{
    int a;
    while (scanf("%d", &a) == 1)
    {
        printf("%d\n", a * a);
    }
    return 0;
}
  • 示例如下

  • 2

  • 4

  • 3 2

  • 9 4

  • a

  • 返回值为0,该程序停止.

  • 注意:

  • 这种方法有一定的局限性

  • 示例代码如下

int main()
{
    int a,b;
    while (scanf("%d%d", &a,&b) == 2)
    {
        printf("%d\n", a+b);
    }
    return 0;
}
  • 以上代码,除了输入不匹配类型的值,输入几个参数都停不下来
    如图在这里插入图片描述
  • 如图所示,只有输入不匹配类型参数,令其返回值为0时,代码退出。
分析正整数法拥有局限性的原因

在具体分析为什么会出现上述原因前,我们先要了解scanf读取的特点

  • (1)scanf返回值的特点,在前文已有提及,这里不在重复

  • (2)对scanf来说,空格和回车都可以成为两个数字之间的分割.

  • (3)当scanf读取到输入多于数量的值后,会根据输入的顺序读取有效位。

通过上述分析的scanf分析的特点,我们可以得出以下几个正整数法具有局限性的原因

  • 在利用正整数法时,回车会被当做两个数字的分割,因此当你输入的数据数量不够时,回车是不会让程序停下来的

  • 在这里插入图片描述

  • 当你输入多出scanf输入数量的数据时,scanf只会按顺序读取有效位,多余的数据scanf会下一次再读取。在这里插入图片描述

总结一下正整数法
  • 对于正整数法,令scanf返回值等于scanf需要我们输入数据的个数时就能实现多组输入,而一旦scanf返回值不等于scanf需要输入数据的个数时,即输入过多数据时,根据scanf按顺序读取有效位的特点,就只有令它返回值为0(输入不匹配类型)或者用 "Ctrl + z" 组合键然后按 Enter 键的方式来告诉系统已经到了EOF,该使程序停下了。

  • 其中要注意的时,当输入数据过少时,由于在scanf中空格和回车都可以用来分隔,程序也是不会停下的。


2.特殊值法

在有些问题中不知道要经过几次循环,通常我们给定一个特殊值表示输入的结束。

1)通过设定最后一次循环的特殊参数

在某些情况下,我们可以通过让最后一次循环条件为特殊值来实现。

  • 代码如下:
    该程序用来求a+b的值

int main()

{
       int m, n;
       scanf("%d %d", &m, &n);
       while (m != 0&&n!= 0)//当m或者n任意一个为0时,代码停止运行,此时不会打印最后一个m+n的值
        {
            printf("%d\n", m + n);
            scanf("%d %d", &m, &n);
        }
        return 0;
    }
    
  • 示例如下
  • 180 220
  • 400
  • 0 20
  • 无输出值,循环停止

总结

  • 这两种方法都有各自适合的环境,其中利用scanf的返回值适合用于在不知道需要输入几组数据时,结合while循环使用。而特殊值法在特殊情况下通过给与特值能够更加方便快捷的实现多组数据输入。通常情况下,我个人更加推荐利用scanf返回值来实现多组输入。

  • 今天的分享就到此结束啦,其中由于个人水平不足而导致文章中出现错误,欢迎在评论区指出。同时有什么问题想要与博主讨论也欢迎私信哦。

ps:随着博主水平的进步,也会定期订正以前文章中出现的错误,以提高该博客的整体水平。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐