代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

在这个C字谜中要替换什么?

  •  1
  • whacko__Cracko  · 技术社区  · 14 年前

    现在这是我从一些试卷中得到的一个愚蠢的谜题,遗憾的是我无法从过去的15分钟中找到答案。

    #include <stdio.h>
    
    int main(void){
    
        /* <something> */    
    
          putchar(*(wer[1]+1));
       return 0;
     }
    

    为了得到输出,我们应该用什么代替什么呢? e 现在我们知道了 putchar 采取了 int 作为参数,但此代码假定给出指针。此问题是否有效?

    6 回复  |  直到 14 年前
        1
  •  8
  •   David Thornley    14 年前

    自从 a[i] 是一样的 *(a + i) 根据定义,可以转换 putchar() 论证 wer[1][1] . 所以,有点像 char *wer[2] 将是一个令人满意的定义,以及 wer[1][1] == 'e' 会工作。

        2
  •  13
  •   Alok Singhal    14 年前
    const char *wer[2] = { "failed", "test" };
    
        3
  •  3
  •   Kyle Butt    14 年前
    char * wer[] = { "foobar", "he"};
    
        4
  •  0
  •   goldenmean    14 年前

    首先,在您提到的代码中,putchar()的参数是

       *(wer[1]+1)
    

    不是指针。似乎wer[1]是一个指针,而wer[1]+1指向的地址被取消引用。因此,如果wer是指向int的指针数组,那么putchar参数应该是int,这很好。

    现在,代替某些东西的代码可以是 你没有清楚地提到e是什么意思,e是char还是e是2.71…(自然对数底)在这两种情况下,用这段代码应该很容易得到输出。

    -广告

        5
  •  0
  •   Susam Pal    14 年前

    一个简单的答案是:

       char **wer;
       putchar('e');
       return 0;
    

    例如,完整的代码需要:

    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        /* Something starts here */
        char **wer;
        putchar('e');
        return 0;
        /* Something ends here */
    
        putchar(*(wer[1] + 1));
        return 0;
    }
    

    输出是:

    susam@swift:~$ gcc really-silly-puzzle.c && ./a.out && echo
    e
    susam@swift:~$
    

    一个更有趣的问题是:可以替换/**/以获得输出“e”的最短代码是什么?

        6
  •  -1
  •   AnT stands with Russia    14 年前

    从学究的角度来看,这个问题没有正确的答案。问题无效。如果输出不以换行符结尾,C语言本身就不能保证程序的输出。见7.19.2/2

    文本流是有序序列 组成行的字符, 每一行包含零个或多个 字符加终止新行 性格。是否最后一行 需要终止新行 字符是实现定义的。

    此程序输出到标准输出,即文本流。这个程序的输出依赖于实现,而不管您用什么来代替 /* <something> */ ,这意味着这个问题对于某些特定的平台可能是有意义的,但对于抽象的C语言问题则没有意义。

    不过,我很怀疑你的主考是否期待着你这样的学究:))