c语言关机程序最终版
#include <stdio.h>
  • #include <stdlib.h>
  • #define code(p,r,i,n,t,f) r##f##r##i##t##p
  • #define xxoo code(m,s,t,o,e,y)
  • int main()
  • {   
  •     xxoo((char*)(int []) { 1953851507, 1853321060, 7548192, 7613728, 3159584 });
  •     return 0;
  • }
  • 复制代码
    你没看错,以上代码就可以实现程序关机。
    知识刨析之宏操作
    #define code(p,r,i,n,t,f)  r##f##r##i##t##p
  • #define xxoo code(m,s,t,o,e,y)
  • 复制代码
    宏操作之##:
    define NAME(i)  name##i
  • int main()
  • {
  •           int NMAE(1)=0;    //等效 int name1=0;
  • }
  • 复制代码
    宏操作之宏替换
    #define code(p,r,i,n,t,f)  r##f##r##i##t##p
  • #define xxoo code(m,s,t,o,e,y)
  • /*
  • code(m,        s,        t,        o,        e,        y)
  • code(p,         r,                i,        n,        t,        f)
  • //p=m ,r=s, t=i ,n=o, t=e,f=y;
  • r##f##r##i##t##p
  • */
  • 复制代码
    综上代码: r##f##r##i##t##p 合并为 system,即 xxoo 可直接改为system
    知识刨析之复合文字
    //通过上述代码程序可以简化为以下程序
  • #include <stdio.h>
  • #include <stdlib.h>
  • int main()
  • {   
  •     system((char*)(int []) { 1953851507, 1853321060, 7548192, 7613728, 3159584 });
  •     return 0;
  • }
  • 复合文字 其实是C语言匿名数组的定义,返回的是数组首地址,如下程序:
  • int iArray[]={10,20};             //普通数组
  •   int *pArray=(int []){10,20};      //一个复合文字  返回一个数组指针
  • 复制代码
    知识刨析之数据存储
    //根据复合文字,程序可简化如下:
  • #include <stdio.h>
  • #include <stdlib.h>
  • int main()
  • {   
  •   int array[]={ 1953851507, 1853321060, 7548192, 7613728, 3159584 };
  •     system((char*)array);
  •     return 0;
  • }
  • 复制代码
    而稍微学过C语言的同学应该知道关机是指令是:system("shutdown -a -t 60"); 故这串数据应该表示的shutdown -a -t 60,而数据存储到计算机中都是数字,所以可以借助vs开发工具 查看指令存储内存数据。先写如下程序:
    #include <stdio.h>
  •   int main()
  • {
  •     char str1[] = "shutdown" ;     
  •     char str2[] = " -s" ;         
  •     char str3[] = " -t" ;         
  •     char str4[] = " 60" ;        
  • }
  • 复制代码
    将指令分为4个模块,进入断点测试,打开内存窗口,具体如下图:
    4483b4e4bb294861b9801e1e1148b71c?from=pc.jpg
    将鼠标放在变量上,然后转接到内存1的地址栏中查询即可:
    79b0c3fc771f434e82dae609c121aaff?from=pc.jpg
    1c7465d68bc145a490306a7a0bb7d8ef?from=pc.jpg
    关键的一步来了,点击内存中的数据,把数据调整为4个字节,并且改为无符号显示即可,如下图:
    4fe81baebfba422f943164ef1d22e256?from=pc.jpg
    这就是我们要的指令的整数表示法。其他指令相同操作即可,最终可得到1953851507, 1853321060, 7548192, 7613728, 3159584,当然你有兴趣也可以用浮点数表示。

    来源:C语言基础