ACM输入输出套路汇总

Author Avatar
Patrick 2月 15, 2017

ACM输入输出套路汇总

输入

注意输入不要死套模板!比如刚才有道题输入可以有一个为零,但是我套模板就卡了半天!一直没发现错误!

输入中有一/多个n来指示输入的情况

  • 输入的都是数字/字符

这个就比较简单了,直接两层循环读取输入的数字

1
2
3
4
5
scanf("%d", &n);
while (n--)
{
scanf("%d", &num);
}
  • 后面读取的是字符串

这个地方容易遇到坑,字符串一直都是比较麻烦的

1.用gets()读取字符串

1
2
char a[1000];
gets(a);

2.用scanf读取字符串

1
2
char a[1000];
scanf("%s", a);

但是注意两者都是有坑的!

gets()输入的时候如果前面还有输入的就要加一个getchar()

1
2
3
4
scanf("%d", &n);
getchar()
char a[1000];
gets(a);

原因是gets会把前面scanf输入没有读取的换行符也当做需要的读取进去,这就导致读取的内容“少一行”,所以要用一个getchar来吸收这个换行符。
还有就是gets由于存在安全隐患被废除了,用倒是可以用,不过官方不推荐,所以最好不要用,不过gets比fgets方便一些,竞赛的话,看个人喜好了。

关于fgets

定义函数:har fgets(char s, int size, FILE * stream);

函数说明:fgets()用来从参数stream 所指的文件内读入字符并存到参数s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止, 最后会加上NULL 作为字符串结束.

1
2
char a[1000];
fgets(a, 1000, stdin); // 这家伙把换行符也读进去了,输出的时候就不用加换行符了

scanf输入的时候字符串中不能有空格!不然就会在空格处停下来,有空格的就不考虑scanf.

没有设有特定的提示输入来告诉你输入多少

这时候就要用输入函数的返回值来判断了

  • scanf

当输入成功的时候,返回值是输入成功的数字的大小,部分成功也会返回成功个数。而发生错误或者end of file则返回EOF

所以可以这样判断:

1
2
while (scanf("%d %d", &m, &n) == 2 && m && n)
{}

或者:

1
2
while (scanf("%d", &m) != EOF)
{}

上面这种也可以简写为:

1
2
while (~scanf("%d", &m))
{}

  • gets/fgets

这两个函数在成功的时候都会返回相应的指针,也就是数组名, 而失败就会返回NULL,因此可以:

1
2
while (gets(a))
{}

输入的话基本就是这两大类了,其中根据不同的情况再做改变,比如说输入0结束,这就很简单了,稍微改一下就可以了。

输出

输出的话主要是要判断是不是最后一个元素,像一行输出特别多组数据的时候特别要注意,因为涉及到换行。

下面这种就是缩短了循环,把特殊情况独立出来了,这样就避免了判断,当然判断i是不是等于n-1也是可以的。

1
2
3
4
5
for (int i = 0; i < n - 1; ++i)
{
printf("%d ", a[i]);
}
printf("%d\n", a[n - 1]);

还有的是最后一行不留换行等等,一定要看清楚题!不然很容易踩坑!暂时想到这么多,后面还有新的再补充!