关于C语言中scanf多组输入的实现

简介: 关于C语言中scanf多组输入的实现

前言

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

一.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分析的特点,我们可以得出以下几个正整数法具有局限性的原因

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


3edde01abf6e4fcebd1368a4b382dbe7.png

  • 当你输入多出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:随着博主水平的进步,也会定期订正以前文章中出现的错误,以提高该博客的整体水平。


目录
相关文章
|
6天前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
280 0
|
存储 缓存 编译器
C语言第四弹---printf和scanf详解
C语言第四弹---printf和scanf详解
|
C语言
【C语言基础考研向】05 scanf读取标准输入超详解
本文详细解析了C语言中`scanf`函数的工作原理及常见问题。首先介绍了`scanf`如何处理标准输入,并通过示例说明了为何有时会出现阻塞现象及其解决办法。接着探讨了当输入包含多种数据类型时,特别是字符型数据的处理方式,强调了格式控制的重要性,并给出了正确的输入格式示例。通过正确配置,可以避免因空格和换行符导致的问题,确保数据准确读取。
397 10
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
358 8
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
153 5
|
11月前
|
C语言
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
480 0
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
367 2
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
234 1
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数
333 1
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法