在刷题进步的过程中遇到了一些多组输入的问题,这里简单总结下
方法一:用for循环实现
int a = 0, i = 0;
scanf("%d", &a);
for (i = 0; i < a; i++) {
int b = 0;
scanf("%d", &b);
}
这里就可以实现输入a组整数数据,a是自己定的,算作已知输入组数的情况
方法二:用while循环实现
int a = 0, i = 0;
scanf("%d", &a);
while (a--) {
int b = 0;
scanf("%d", &b);
}
这是利用了while函数循环的原理,即进入循环前先判断表达式的值,如果非0,进入循环;等于0,退出循环。
值得一提的是这里用到了后置操作符--。while(a--)会先根据a的值判断是否进入循环,再执行a--操作,所以这里循环a次,输入a组数据;若我们写成while(--a)便会先执行a--操作,再根据a--的值判断是否进入循环,这样就只会循环a-1次,输入a-1组数据。
方法三:EOF法
int a = 0;
while (scanf("%d", &a) != EOF)
{
}
这是我自己做题中经常使用的方法,首先我们要知道用scanf()函数进行输入后,scanf()是有返回值的,这个返回值根据我们输入的数据个数来决定,输入n个有效数据,返回值就是n;未输入有效数据返回值为0
而EOF(end of file)是文件结束的标志,值为-1;
正常输入的情况下scanf()函数的返回值 != -1,判断条件为真,进入循环,这样就可以一直输入下去了
当然,等我们输入完毕后,按下Ctrl+Z即可结束循环
方法四:EOF法其它形式
int a = 0;
while (~scanf("%d", &a))
{
}
~是C语言中的单目操作符,作用是对二进制按位取反
刚刚我们说到,scanf()函数读取数据后会有返回值,这里即对scanf的返回值的二进制按位取反,再判断这个值为0还是非零。
什么情况下这个值等于0呢?答案就是当scanf()函数返回值为-1(EOF的值为-1)的时候
这里我解释一下,负数在计算机中是按其补码的形式来存储的。
推算一下可知-1的二进制存储下所有二进制位都是1,按位取反得0,循环结束