[c 语言谜题 第二题] 程序改动,求输出数字

2018-09-27 18:33:33 +08:00
 shilyx

昨天出了一道题[c 语言谜题] 程序填空,老程序员来做做,不少朋友都搞定了,今天是第二题

#include <stdio.h>

struct FileData {
    FILE *fp;
    size_t size;
    unsigned char buf[1024];
};

main() {
    struct FileData fileData;
    unsigned char res = 0;
    size_t i;

    fileData.fp = fopen(__FILE__, "rb");
    fileData.size = fread(fileData.buf, 1, sizeof(fileData.buf), fileData.fp);

    for (i = 0; i < fileData.size; ++i) {
        if (fileData.buf[i] != ' ' && fileData.buf[i] != '\t' && fileData.buf[i] != '\r' && fileData.buf[i] != '\n') {
            res += fileData.buf[i];
        }
    }

    fclose(fileData.fp);
    printf("%u\n", (unsigned)res);
}

此程序是c 程序,文件扩展名“.c ”,意在将自身源代码中的所有“有效字符”相加后输出结果,虽然相加发生了溢出,但对于确定的输入,会有确定的输出。

此程序运行后输出的数字是220,可以先验证一下。

要求,替换掉源代码中的一个字符,条件如下:

问:经过了你的合法的替换,程序运行后的输出数字是几呢?

ps:角度比较刁钻,切勿因此虐心,仅供一乐,不承担法律责任

2670 次点击
所在节点    程序员
27 条回复
pkokp8
2018-09-27 18:53:44 +08:00
第一感觉,18 行入手
shilyx
2018-09-27 18:57:46 +08:00
@pkokp8 试试吧,不过和我预设的答案不一致

有多个答案也不一定
pkokp8
2018-09-27 18:58:54 +08:00
@pkokp8 源程序功能完全不变,改 if 判断最后一个!为>,输出当然不变。这算取巧了吧
pkokp8
2018-09-27 19:01:43 +08:00
@pkokp8 忘了源代码的一起了,193
pkokp8
2018-09-27 19:05:19 +08:00
@pkokp8 脑抽了,能不能删帖。。。。
刚吃完饭回到电脑前试了下不对
GeruzoniAnsasu
2018-09-27 19:08:25 +08:00
unsigned char 作为和 哈哈哈哈


我的结果是 19
GeruzoniAnsasu
2018-09-27 19:09:37 +08:00
@GeruzoniAnsasu 啊,测错了 丢人
whoami9894
2018-09-27 19:12:40 +08:00
112
不过好像改变意图了
GeruzoniAnsasu
2018-09-27 19:21:53 +08:00
emmmmmm 219 221 203 我只有 gcc
innoink
2018-09-27 19:41:52 +08:00
倒数第三行
innoink
2018-09-27 19:48:11 +08:00
205
innoink
2018-09-27 19:48:28 +08:00
。。。
casparchen
2018-09-27 20:05:21 +08:00
for (i = 0; i < fileData.size; ++i)
这句,把小于符号完成异或^
casparchen
2018-09-27 20:05:39 +08:00
结果 254
casparchen
2018-09-27 20:08:14 +08:00
异或的话,只有 i= fileData.size 才是 false 然后退出循环。不影响结果
innoink
2018-09-27 20:13:02 +08:00
那就是改 for 那一行 254
建议附上一个在线编译器比如 https://tool.lu/coderunner 方便手机用户
codepad 一直打不开
casparchen
2018-09-27 20:20:57 +08:00
@casparchen #13 好吧,换成减号也是可以的,结果 205
casparchen
2018-09-27 20:30:05 +08:00
第二种换法,if (fileData.buf[i] != ' ' && fileData.buf[i] != '\t' && fileData.buf[i] != '\r' && fileData.buf[i] != '\n')
这句任意&&换成&+也不影响结果。
1 && 1 -> 1
1 &+ 1 -> 1
1 && 0 -> 0
1 &+ 0 -> 0
0 && 0 -> 0
0 &+ 0 -> 0
Ediacaran
2018-09-27 20:48:19 +08:00
< 改成 - 就是 205 了
garzon
2018-09-27 21:45:40 +08:00
感觉这题漏洞挺多的...上面已经有了正解 205,我来给个非预期解 222:
size_t i; 改成 size_t i=

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX