如何直接操作输出流?(Was:为什么在c中赋值时它不是增量运算符的增量值?)
我从中修复了代码,以便它可以编译:如何直接操作输出流?(Was:为什么在c中赋值时它不是增量运算符的增量值?),c,obfuscation,C,Obfuscation,我从中修复了代码,以便它可以编译: #define text (); #define return &argv;return int *** emphasized () { static int x, *argv = &x, **xpp = &argv; puts("\r10 11 11"); return &xpp; } int main (int argc, char *argv[]) { int a; int n = 10
#define text ();
#define return &argv;return
int *** emphasized () {
static int x, *argv = &x, **xpp = &argv;
puts("\r10 11 11");
return &xpp;
}
int main (int argc, char *argv[]) {
int a;
int n = 10;
printf("%d",n);
n++;
printf("%d",n);
a = n++;
printf("%d",n);***emphasized text***
return 0;
}
在最初的问题中,提问者说:
输出=10 11 11为什么它不是第二个增量运算符中n的增量值
这就是为什么他做了一些有趣的事情。我试图想出一种方法,利用询问者的文字代码使其按照他/她所说的去做。为此,我将***强调的文本***作为源代码的一部分
我的问题是:如何更改强调,使其在不调用任何输出函数的情况下呈现10 11输出?我希望观察一种方法,将printf渲染的输出更改为标准输出,以添加空格,但将最后一个数字弄糟
因为这个问题用模糊标记,如果解决方案涉及添加更多的定义,请尝试。n增加到12,但由于n从未打印,其值无关紧要
通过预处理器运行这些垃圾,你就会明白原因
有一个define命令可以使所有printf语句无效
实际输出来自强调的输入。n增加两倍,并且它也被打印出来,正如您所期望的那样 但是文本被定义为一对括号和分号:;,并将返回替换为&argv;返回 那么代码呢
***emphasized text***
return 0;
变成:
***emphasized();***
&argv;return 0;
或者稍微不那么奇怪的格式:
***emphasized();
***&argv;
return 0;
所以printfs完全按照它们看起来要做的做,然后被调用,它用'\r'回车符备份光标,不换行,并打印出您的10 11
所有星号仅用于显示,取消引用指针,但不使用结果。以下是原始代码:
#define text ();
#define printf(a,b) (void)0
#define return &argv;return
int *** emphasized () {
static int x, *argv = &x, **xpp = &argv;
puts("\r10 11 11");
return &xpp;
}
int main (int argc, char *argv[]) {
int a;
int n = 10;
printf("%d",n);
n++;
printf("%d",n);
a = n++;
printf("%d",n);***emphasized text***
return 0;
}
以下是通过预处理器运行后的代码:
int *** emphasized () {
static int x, *argv = &x, **xpp = &argv;
puts("\r10 11 11");
&argv;return &xpp;
}
int main (int argc, char *argv[]) {
int a;
int n = 10;
(void)0;
n++;
(void)0;
a = n++;
(void)0;***emphasized ();***
&argv;return 0;
}
注意printf语句不会出现在预处理代码中;在这个版本中,n的值根本不会显示在控制台上。输出来自强调的函数 这里有一个稍微不那么模糊的版本,它将每个printf调用重新映射到最终按照原始asker所述构造输出的东西。它稍微简单一些,因为它没有定义一个愚蠢的函数。它还可以避免不必要地取消对argv的引用,以避免argc为0时出现未定义的行为 此版本还有一个属性,即如果从程序中删除***强调文本***字符串,程序也将按照所述的询问者进行操作
#include <stdio.h>
#define printf(f,x) printf(x>11?"%d\n":"%d ", x>11?x-1:x);
#define emphasized &argv;
#define text if(0)
#define return &argv;return
int main (int argc, char *argv[]) {
int a;
int n = 10;
printf("%d",n);
n++;
printf("%d",n);
a = n++;
printf("%d",n);***emphasized text***
return 0;
}
是什么让你认为增量没有发生?如果是输出,那只是因为puts调用输出。为什么要删除define printfa,b void0行?@JohnBode:不需要它来获取观察到的输出。@user315052:是的;如果再次运行该程序,肯定会得到不同的输出。@JohnBode:如果重定向到文件,但如果在控制台上观察到,则不会。