一个比较娱乐的题目

Janyue 2011-06-20 02:49:17

#include <iostream.h>

/////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
cout<<"举头望明月\n";
return 0;
}
/////////////////////////////////////////////////////////////////////

/*
* 题目说明,这是一个典型的hello world程序,正常运行的话会在控制台
* 输出:“举头望明月”
* 你能否在不修改main函数的情况下,使其输出
* “举头望明月,低头思故乡”
* 在上网搜索答案之前,请先尝试思考一下
*/

娱乐下~~~~~~~~
...全文
2511 96 打赏 收藏 转发到动态 举报
写回复
用AI写文章
96 条回复
切换为时间正序
请发表友善的回复…
发表回复
Misery 2011-09-29
  • 打赏
  • 举报
回复
#include<iostream>
#include<windows.h>
using namespace std;

#define TEST1
//#define TEST2

#ifdef TEST1


/*int fun()
{
cout<<"TEST1 CALLS\n";
cout<<"hello world"<<endl;
exit(0);
return 0;
};
*/
class world
{
public:
~world()
{
system("cls");
// cout<<"hello world\n";
printf("hello world\n");
//exit(0);
// fun();
}
};
world a;


#else
#ifdef TEST2


#define func main
void func()
{
cout<<"TEST2 CALLS\n";
cout<<"hello world"<<endl;
}
#undef func
#define main unuse


#else


class MyCout
{
public:
MyCout& operator <<(const char *)
{
cout<<"TEST3 CALLS\n";
cout<<"hello world"<<endl;
return *this;
}
};
#define cout MyCout()


#endif
#endif

void main()
{
cout<<"hello world\n";
}

#define main mainskipped

int main(int argc, char* argv[])
{
cout<<"hello\n";
return 0;
}
horicon 2011-08-03
  • 打赏
  • 举报
回复
哈哈,厉害啊
DAMNROMANCE 2011-08-03
  • 打赏
  • 举报
回复
学习了……虽然不全看得懂@@
zjs100901 2011-08-03
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
woncomp 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 banana5240 的回复:]
C/C++ code

#if 1
int mian(int argc, char* argv[])
{
cout<<"举头望明月,低头思故乡\n"<<endl;
return 0;
}

#else
int main(int argc, char* argv[])
{
cout<<"举头望明月\n";
return 0;
}……
[/Quote]

你们都败了,这个最牛逼!
nightkids_008 2011-06-25
  • 打赏
  • 举报
回复
个人观点:
解析PE头,获得DS的值,用汇编更改数据段的值。。。。没试过,原理上是可行的。。
失散糖 2011-06-25
  • 打赏
  • 举报
回复
很强大啊
bfdeh 2011-06-25
  • 打赏
  • 举报
回复
我也来说两句
1、个人觉得宏定义并不是一个好的选择,因为宏定义是在预处理的时候完成的,严格意义上说main函数在编译之前已经被修改了。
2、全局变量构造或析构,因为这个全局变量并没有在任何地方被引用,所以链接的时候链接器是否会做优化,丢掉这个全局变量呢?(如果是C语言的话,一般都会,但是C++有构造和析构函数,这里面可能会做事情,所以不清楚是否会被优化掉)

个人比较赞成的做法
1、修改程序入口
2、操作符重载
3、修改常量字符区数据(但是我不知道怎么找到字符串的地址)
wesweeky 2011-06-24
  • 打赏
  • 举报
回复
才华横溢的人们啊
xzjxylophone 2011-06-24
  • 打赏
  • 举报
回复
都乃神人也....
竞天问 2011-06-24
  • 打赏
  • 举报
回复
真的学习了!
jsjygm 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 demon__hunter 的回复:]
众所周知,字符串保存的常量字符区,字符串当做参数传入函数时,只是传递的字符串在常量区得地址,
所以在运行期,把那个地址里的数据修改一下,大家懂的啊,比较接近hack的了

C/C++ code

#include <iostream>
#include<windows.h>
using namespace std;

class Hack
{
public:
Hac……
[/Quote]
怎么直接出错啊。
jsjygm 2011-06-24
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;

/**添加代码如下:**/
#define func main
int unuse();
int func()
{
cout<<"抬头望明月,低头思故乡"<<endl;

system("pause");
unuse();//在这里为什么不能调用main()。只能用unuse?
return 0;
}
#undef func
#define main unuse
/****/

int main()
{
cout<<"抬头望明月"<<endl;

system("pause");
return 0;
}

独酌逸醉 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 m11668700 的回复:]

哈哈~
#define 举头望明月 举头望明月,低头思故乡
哈哈
[/Quote]
这是最牛逼的!
CodeArhat 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 huangyannew 的回复:]
C/C++ code
#define cout cout<<"举头望明月,低头思故乡\n"; return 0; cout
[/Quote]
return是亮点,学了一招
#define cout cout << "举头望明月,低头思故乡"; return 0; cout
int main(int argc, char* argv[])
{
cout << "举头望明月\n";
return 0;
}
#undef cout
junlong666 2011-06-24
  • 打赏
  • 举报
回复
都是淫才啊!!!
matrixcl 2011-06-23
  • 打赏
  • 举报
回复
总结一下,嘿嘿



---------------------------------
1.修改main入口点法。

1、2、33楼



---------------------------------
2.静态变量析构函数法。

1、4、11楼

11楼的构造函数中注册_onexit函数,实际作用和析构函数调用差不多


4楼提到换行符无法覆盖的问题,解决方法
8楼操作输出位置、43楼清屏


---------------------------------
3. 静态变量构造函数法。

输出完直接exit(0),这个比较暴力

6、13

---------------------------------
4. 宏定义别名main

9、20、39
39楼实际用的是#if 1 ... #else ... #endif 宏. 但实际作用和给main取别名是差不多的,就归在这里了。

---------------------------------
5. 宏定义别名cout

41
这个超精简

---------------------------------
6. 修改常量字符串法。

14
黑客啊。不过此法有越界风险。


---------------------------------
7. 重载<<法
16、37、59

另外53楼提到的改进不错。


---------------------------------
8. 其他黑客方法。(待验证)

22楼的方法感觉能行,但不会操作。。
47楼的方法应该可行,但不具备移植性
caoshaomin 2011-06-23
  • 打赏
  • 举报
回复
来学习下。。
long2015 2011-06-23
  • 打赏
  • 举报
回复
源程序不能运行。
using namespace std;
matrixcl 2011-06-23
  • 打赏
  • 举报
回复
我来一个,感觉有点投机取巧。

ostream& operator <<(ostream &os, const char * str)
{
printf("举头望明月,低头思故乡\n");
return os;
}

int main(int argc, char* argv[])
{
cout<<"举头望明月\n";
return 0;
}

加载更多回复(75)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧