
昨天出了一道题[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:角度比较刁钻,切勿因此虐心,仅供一乐,不承担法律责任
1 pkokp8 2018-09-27 18:53:44 +08:00 via Android 第一感觉,18 行入手 |
6 GeruzoniAnsasu 2018-09-27 19:08:25 +08:00 unsigned char 作为和 哈哈哈哈 我的结果是 19 |
7 GeruzoniAnsasu 2018-09-27 19:09:37 +08:00 @GeruzoniAnsasu 啊,测错了 丢人 |
8 whoami9894 2018-09-27 19:12:40 +08:00 via Android 112 不过好像改变意图了 |
9 GeruzoniAnsasu 2018-09-27 19:21:53 +08:00 emmmmmm 219 221 203 我只有 gcc |
10 innoink 2018-09-27 19:41:52 +08:00 via Android 倒数第三行 |
11 innoink 2018-09-27 19:48:11 +08:00 via Android 205 |
12 innoink 2018-09-27 19:48:28 +08:00 via Android 。。。 |
13 casparchen 2018-09-27 20:05:21 +08:00 for (i = 0; i < fileData.size; ++i) 这句,把小于符号完成异或^ |
14 casparchen 2018-09-27 20:05:39 +08:00 结果 254 |
15 casparchen 2018-09-27 20:08:14 +08:00 异或的话,只有 i= fileData.size 才是 false 然后退出循环。不影响结果 |
16 innoink 2018-09-27 20:13:02 +08:00 |
17 casparchen 2018-09-27 20:20:57 +08:00 @casparchen #13 好吧,换成减号也是可以的,结果 205 |
18 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 |
19 Ediacaran 2018-09-27 20:48:19 +08:00 < 改成 - 就是 205 了 |
20 garzon 2018-09-27 21:45:40 +08:00 感觉这题漏洞挺多的...上面已经有了正解 205,我来给个非预期解 222: size_t i; 改成 size_t i= |
21 garzon 2018-09-27 21:49:24 +08:00 另:源程序在 msvc2017 不加#define _CRT_SECURE_NO_WARNINGS 是无法编译通过的,233 |
22 garzon 2018-09-27 21:53:30 +08:00 @casparchen 同理换成&-也行 |
23 garzon 2018-09-27 21:58:34 +08:00 试了下&&换&-,除了最后一个&&换成&-不行,其他都可以 |
25 hmzt 2018-09-28 10:41:46 +08:00 我有个更刁钻的角度,你这段代码好像没有\t |
26 bfdh 2018-09-28 17:41:54 +08:00 没实测,貌似把下面这个数组任意改大小都行吧? unsigned char buf[1024]; |
27 w01230 2018-10-12 08:35:02 +08:00 貌似在 for 这部分动比较容易一些。 |