一行空行引发的血案

原代码如下:

#!/usr/bin/perl

use File::Path ;
$\="\n";

my $cfg="clr.cfg";
open (mycfg,$cfg) or die "open $cfg error![$!]";

while(<mycfg>)
{
    chomp;
    &chk_file();
}

close(mycfg);

sub chk_file
{
    $_=$ENV{"HOME"}.$_;
    if (-f )
    {
        &unlink_file();
    }
    if (-d )
    {
        &unlink_path();
    }
    return 0;
}

sub unlink_path
{
    chomp;
    my $path=$_;
    chdir $path or die "chdir error![$!]";

    opendir(myfile,$path) or die "find $path error![$!]";

    foreach (readdir myfile)
    {
        next if $_ eq "." or $_ eq "..";
        rmtree($_) if -d;
        unlink ;
    }

    closedir(myfile);
    rmdir $path;
    mkdir $path;
    return 0;
}

sub unlink_file
{
    unlink or die "remove $_ error![$!]";
    return 0;
}

config文件如下:

/tmp/

执行结果是:

家目录下所有文件文件夹全部被删除!

包括脚本本身,所以好像原脚本不是这样的...

o(︶︿︶)o 唉。。。堪比电锯惊魂啊,关键是在公司的开发机上执行的,大家半年的心血就没了,程序倒是有备份,但是有的头文件什么的,全部丢失。

记下这次教训,提醒自己,还太年轻,做事不谨慎,平时也没做好备份工作,这是对自己和其他同事的不负责任。


备注:自己配置cfg文件时其实也主意到了哪行空行,但是完全没有想到它带来的结果,还抱着试试看的心态,想看看程序遇到空行会怎么办....程序太不严谨了。记下此事件,警钟长命。

基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码 动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB 融合DWA的青蒿素优化算法(AOA)求解无人机三维动态避障路径规划,MATLAB代码 基于动态环境下多智能体自主避障路径优化的DWA算法研究,MATLAB代码 融合DWA的青蒿素优化算法AOA求解无人机三维动态避障路径规划,MATLAB代码 基于DWA的多智能体动态避障路径规划算法研究,MATLAB代码 融合动态窗口法DWA的粒子群算法PSO求解无人机三维动态避障路径规划研究,MATLAB代码 基于粒子群算法PSO融合动态窗口法DWA的无人机三维动态避障路径规划研究,MATLAB代码 基于ACOSRAR-DWA无人机三维动态避障路径规划,MATLAB代码 基于ACOSRAR-DWA无人机三维动态避障路径规划,MATLAB代码 基于DWA的动态环境下无人机自主避障路径优化,MATLAB代码 基于DWA的动态环境下机器人自主避障路径规划,MATLAB代码 基于城市场景下RRT、ACO、A*算法的无人机三维路径规划方法研究,MATLAB代码 基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码 导航变量的多目标粒子群优化算法(NMOPSO)求解复杂城市场景下无人机三维路径规划,MATLAB代码 原创:5种最新多目标优化算法求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),MATLAB代码 原创:4种最新多目标优化算法求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),MATLAB代码 高维超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维
你强调“运行结果不要多一行空行”,说明你可能在使用 OJ(在线评测系统)时因为 **输出末尾多了一个换行** 或者 **看起来像有空行** 而被判错。 但实际上,根据题目要求: > 输出 q 行,第 j 行输出对应的结果。 ✅ 每个 `type == 2` 查询输出一个整数并换行,是正确的格式。 ❌ 最后不能多输出任何内容(包括额外的换行或空格)。 我们之前的代码: ```cpp cout << cards.top() << '\n'; ``` 会在每次查询 2 时输出一行,这是完全正确的。 --- ### ✅ 正确性确认 只要输入中有 `k` 个类型 2 查询,我们就输出 `k` 行,每行一个数字 + 一个 `\n`,这是标准做法。 例如输出: ``` 0 3 4 0 ``` 这四行是 **4 个换行符**,分别紧跟每个数字,**不是在最后额外加了一行空行**。 但如果输出变成: ``` 0 3 4 0 ← 这里还有一个换行(第五行为空) ``` 那才是“多一行空行”。 --- ### 🔍 常见导致“多一行空行”的原因 1. 在所有输出结束后手动加了 `cout << endl;` 2. 使用某些模板代码时,在主函数结尾多输出了一个换行 3. 用 `endl` 导致缓冲区行为异常(虽然不影响正确性) --- ### ✅ 终极安全版本:精确控制输出,不使用 `endl`,避免任何多余输出 ```cpp #include <iostream> #include <stack> using namespace std; int main() { // 初始化栈:100 个 0 stack<int> cards; for (int i = 0; i < 100; ++i) { cards.push(0); } int Q; cin >> Q; for (int i = 0; i < Q; ++i) { int type; cin >> type; if (type == 1) { int x; cin >> x; cards.push(x); } else if (type == 2) { cout << cards.top() << '\n'; // 只输出数字+换行,无其他内容 cards.pop(); } } return 0; // 程序结束,不输出任何额外内容 } ``` --- ### ✅ 验证样例 #1 输出(十六进制或逐字符查看) 输出应为: ``` '0' '\n' '3' '\n' '4' '\n' '0' '\n' ``` 共 4 行,最后一行以 `\n` 结尾 —— 大多数 OJ 接受这种格式。 > ⚠️ 注意:POSIX 标准规定文本文件最后一行应以换行符结尾。所以以 `\n` 结尾是合法且推荐的! --- ### ❓那为什么你说“多了一行空行”? 可能是以下误解: | 可能情况 | 解释 | |--------|------| | IDE 显示下一行为空白 | 是正常现象,不代表多输出 | | 评测系统提示 "Presentation Error" | 可能是你输出了空格、制表符或多余换行 | | 自己测试时复制多了回车 | 手动输入容易误操作 | --- ### ✅ 如何验证你的输出是否真的多了空行? #### 方法:重定向输出到文件,查看实际内容 ```bash # 编译 g++ -o cards cards.cpp # 输入测试数据 echo -e "6\n2\n1 4\n1 3\n2\n2\n2" | ./cards > output.txt # 查看行数(应该为 4) wc -l output.txt # 查看具体内容(含不可见字符) cat -A output.txt ``` 预期输出: ``` 0$ 3$ 4$ 0$ ``` 每一行都有 `$` 表示换行符,共 4 行 → 正确。 如果有第五行: ``` 0$ 3$ 4$ 0$ $ ← 多余空行! ``` 那就说明代码有问题。 但我们代码不会产生这个! --- ### ✅ 最终结论 👉 当前代码 **不会多输出一行空行**,格式完全正确。 如果你仍然遇到问题,请检查: - 是否用了旧代码? - 是否在本地误判了输出? - 是否提交时选错了文件? --- ### ✅ 推荐提交代码(最简洁安全版) ```cpp #include <iostream> #include <stack> using namespace std; int main() { stack<int> s; for (int i = 0; i < 100; ++i) s.push(0); int Q, op, x; cin >> Q; while (Q--) { cin >> op; if (op == 1) { cin >> x; s.push(x); } else { cout << s.top() << '\n'; s.pop(); } } return 0; } ``` 📌 此代码逻辑清晰、无冗余输出、符合规范。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值