在这个C拼图中要替换什么?

时间:2010-01-26 18:47:44

标签: c arrays pointers

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

#include <stdio.h>

int main(void){

    /* <something> */    

      putchar(*(wer[1]+1));
   return 0;
 }

为了获得输出e,我们应该替换什么代替。现在我们知道putcharint作为参数但是这段代码假定给出一个指针。这个问题甚至有效吗?

6 个答案:

答案 0 :(得分:13)

const char *wer[2] = { "failed", "test" };

答案 1 :(得分:8)

根据定义,a[i]*(a + i)相同,您可以将putchar()参数转换为wer[1][1]。因此,类似char *wer[2]的内容将是一个令人满意的定义,并且wer[1][1] == 'e'可以使用任何值。

答案 2 :(得分:3)

char * wer[] = { "foobar", "he"};

答案 3 :(得分:0)

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

   *(wer[1]+1)

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

现在代码代替了某些东西 你没有清楚地提到e是什么意思,是char或e是2.71 ...(自然对数基数)在任何一种情况下,用这段代码都很容易得到那个输出。

-AD

答案 4 :(得分:0)

一个简单的答案是:

   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'的最短代码?

答案 5 :(得分:-1)

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

  

文本流是有序序列   字符组成行,   每行由零或更多组成   字符加上终止的换行符   字符。是否最后一行   需要一个终止的新线   字符是实现定义的。

此程序输出到标准输出,即文本流。无论你使用什么代替/* <something> */,这个程序的输出都依赖于实现,这意味着这个问题可能对某些特定平台有意义,但它作为一个抽象的C语言问题毫无意义。

我非常怀疑你的审查员是否期待你的这种迂腐:)))