Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何直接操作输出流?(Was:为什么在c中赋值时它不是增量运算符的增量值?)_C_Obfuscation - Fatal编程技术网

如何直接操作输出流?(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:如果重定向到文件,但如果在控制台上观察到,则不会。