作者firejox (Tangent)
看板C_and_CPP
标题Re: [问题] zj e295. IO 优化
时间Thu Jul 11 23:58:12 2019
光用推文表达可能有点不太清楚,所以来回一篇了
※ 引述《nevikw39 (☆牜攵☆犬羊)》之铭言:
: 大家好,
: 暑假废惹那麽多天,今天总算来做点有意义的事喇
: 题目网址:https://zerojudge.tw/ShowProblem?problemid=e295
: 我现在的问题是,写了个自订的读整数函式,却没有办法准确知道何时 EOF。
: 在我的 Windows 10 (gcc 6.3), WSL Ubuntu (gcc 7.3) 上遇到 Crtl + Z 或 Crtl + D 都
: 可以正常离开,但在 ZeroJudge 连范例测资测试执行都会 TLE 被 killed。
: 程式码:https://pastebin.com/YzWYFedy
: 请各位大大不吝给予意见指教,谢谢
: 顺便问一下,同样是函式模板,为什麽 out 就会自动推导型别,in 却得自己指定呢?
对於小测资会有TLE,通常是卡在有回圈的地方。而这边只有两个地方是有回圈的,
而且会影响while(!feof(stdin))的是输入,因此要去检查输入函式。
Q1: 在读到档尾,或者遇到输入错误时,他会回传什麽?
inline char get()
{
char buf[
1];
fread(buf,
1,
1,
stdin);
return *buf;
}
A: 不知道,因为buf未初始化。(13诫第1条)
Q2: 这样会导致TLE?
A: 会的,因为get()的回传端看编译器怎麽处理未初始化变数。
假设每次呼叫时buf的位址都一样且都不会把区域变数内容清空。
那麽在读到EOF时,get()会回传最後一个输入的字元。如果不是数字,
则会跳出do-while,反之则无穷回圈。
Q3: ZJ的范测最後一行没换行?
A: 是,请注意游标位置。
分享点个人心得,要判断输入输出是否有恼人的换行,可以善用反白,
你可以看得到独特的小方格。
--
d(・ω・d) 微分! (∫・ω・)∫ 积分! ∂(・ω・∂) 偏微分!
(∮・ω・)∮ 沿闭曲线的积分! (∬・ω・)∬ 重积分! ▽(・ω・▽)梯度!
▽・(・ω・▽・)散度! ▽×(・ω・▽×)旋度! Δ(・ω・Δ)拉普拉斯!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.232.143.51 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1562860697.A.12A.html
1F:推 nevikw39: 感谢 f 大,终於过测试执行惹。在 do-while 里判断是否 07/12 21:36
2F:→ nevikw39: eof,是的话看 n 的值决定 return n; 或 exit 07/12 21:37