ACM输入输出套路汇总
ACM输入输出套路汇总
输入
注意输入不要死套模板!比如刚才有道题输入可以有一个为零,但是我套模板就卡了半天!一直没发现错误!
输入中有一/多个n来指示输入的情况
- 输入的都是数字/字符
这个就比较简单了,直接两层循环读取输入的数字
scanf("%d", &n);
while (n--)
{
scanf("%d", &num);
}
- 后面读取的是字符串
这个地方容易遇到坑,字符串一直都是比较麻烦的
1.用gets()读取字符串
char a[1000];
gets(a);
2.用scanf读取字符串
char a[1000];
scanf("%s", a);
但是注意两者都是有坑的!
gets()输入的时候如果前面还有输入的就要加一个getchar()
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 作为字符串结束.
char a[1000];
fgets(a, 1000, stdin); // 这家伙把换行符也读进去了,输出的时候就不用加换行符了
scanf输入的时候字符串中不能有空格!不然就会在空格处停下来,有空格的就不考虑scanf.
没有设有特定的提示输入来告诉你输入多少
这时候就要用输入函数的返回值来判断了
- scanf
当输入成功的时候,返回值是输入成功的数字的大小,部分成功也会返回成功个数。而发生错误或者end of file则返回EOF
所以可以这样判断:
while (scanf("%d %d", &m, &n) == 2 && m && n)
{}
或者:
while (scanf("%d", &m) != EOF)
{}
上面这种也可以简写为:
while (~scanf("%d", &m))
{}
- gets/fgets
这两个函数在成功的时候都会返回相应的指针,也就是数组名, 而失败就会返回NULL,因此可以:
while (gets(a))
{}
输入的话基本就是这两大类了,其中根据不同的情况再做改变,比如说输入0结束,这就很简单了,稍微改一下就可以了。
输出
输出的话主要是要判断是不是最后一个元素,像一行输出特别多组数据的时候特别要注意,因为涉及到换行。
下面这种就是缩短了循环,把特殊情况独立出来了,这样就避免了判断,当然判断i是不是等于n-1也是可以的。
for (int i = 0; i < n - 1; ++i)
{
printf("%d ", a[i]);
}
printf("%d\n", a[n - 1]);
还有的是最后一行不留换行等等,一定要看清楚题!不然很容易踩坑!暂时想到这么多,后面还有新的再补充!