昨天出了一道题[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 这部分动比较容易一些。
|