一道经典面试题的不同解法
该题答案整理于看雪论坛:
原文地址:http://bbs.pediy.com/showthread.php?t=104954
原题这样的,要求在下面的*处添加代码,输出helloworld,不允许修改其他地方:
#include "stdio.h" void print() { * } void main() { }
解答的方式很多种,根本原因是让程序先执行print(),然后在其中输出hellowolrd。反正是各种诡异的方法,下面一一讲说:
方法1:
#include "stdio.h" void print() { #pragma comment(linker, "/entry:print") #pragma comment(linker, "/SECTION:.text,REW" ) int mainCRTStartup(); void main(); __asm { MOV EAX, OFFSET main MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX } mainCRTStartup(); SHOWSTRING: printf ("i am MentalDease\n"); getchar(); } void main() { }
方法2:
#include "stdio.h" void print() { #pragma comment(linker, "/entry:print") void main(); __asm { push offset main } puts ("Hello world!\n"); __asm { ret } } void main() { }
方法3:
#include "stdio.h" void print() { #pragma comment(linker, "/entry:print") #pragma comment(lib, "msvcrt.lib") puts("hello world\n"); } void main() { }
方法4:
#include <stdio.h> void print() { } void main() { printf("Hello, World\n"); #define main AnyUnusedFunctionName } void main() { }
方法5:
#include "stdio.h" void print() { } int i = printf("%s","Hello,world"); void a() { } void main() { }
方法6:
#include "stdio.h" void print() { #pragma comment(linker, "/entry:print") #pragma comment(lib, "msvcrt.lib") void main(); printf ("Hello world!"); main(); } void main() { }
方法7:
#include "stdio.h" void print() { printf("Hello world");} void main(){print();}/* } int main() { return 0; }
方法8:
void print() { printf("hello world\n"); #define main main(){print();} void null } void main() { }
方法9:
#include "stdio.h" void print() { } void main() { printf("Hello World"); } #define main a void fun(){ } void main() { }
有一种落差是,你配不上自己的野心,也辜负了所受的苦难