c++ 中scanf()函数返回值问题

用c++做ACM的时候发现读入数据是一个很头疼的事情,用了各种cin、getline(),发现scanf()最方便,能够默认分割所有的空白字符(空格,回车和指标符都行),然后只需要用外层的for循环来控制读入的个数和存储位置了
对于异常情况的处理,比如数据结束,数据格式错误等,就需要我们了解scanf()函数的返回值了

  1. 首先scanf()函数有返回值且返回值是int型
  2. 当scanf()函数按照指定格式正确接收变量时,返回正确接收变量的个数

  3. 当scanf()函数没有接收到指定格式的变量时,返回值为0

  4. 遇到错误或遇到end of file,返回值为EOF(-1)

比如:
scanf(“%d%d”, &x, &y);

  • 如果x和y都被成功读入,那么scanf的返回值就是2;
  • 如果只有x被成功读入,返回值为1;
  • 如果x和y都未被成功读入,返回值为0;
  • 如果遇到错误或遇到end of file,返回值为EOF(-1)

接下来看看结合实际的数据输入格式,到底怎么用

现在要将形如上面的数据读入

  • 每组数据有两行
  • 第一行的第一个数字告诉我们第二行会有多少个元素
  • 读到输入结束为止

上代码:

#include <stdio.h>
#define MAX 1000
FILE *fin;
int main()
{
int arr[MAX];
fin = fopen("in.txt", "r");
int n,T;
while (fscanf(fin,"%d%d", &n,&T)!= EOF)
{
for (int i = 0; i < n; i++) {
fscanf(fin,"%d", &arr[i]);
}
//打印输出读入的数据
printf("%d %d\n", n, T);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
system("pause");
return 0;
}

结果