2010-01-26 18 views
1

现在,这是我从一些考卷中得到的一个愚蠢的谜题,遗憾的是我无法从最近的15分钟中找出它。在这个C谜题中要替换什么?

#include <stdio.h> 

int main(void){ 

    /* <something> */  

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

我们应该在的地方的东西代替,以得到输出e。现在我们知道putchar需要int作为参数,但是这个代码假定给予pointer.Does这个问题甚至有效?

+0

你在考试期间发布了这个吗? *从最近15分钟*可能意味着一些事情。 – 2010-01-26 18:50:38

+1

是的,我拥有从互联网到书籍的一切:P – 2010-01-26 19:04:45

+1

也许除了“作业”之外,我们还需要一个“考试”标签。 8v) – 2010-01-26 19:18:44

回答

8

由于a[i]相同*(a + i)的定义,你可以改变putchar()参数为wer[1][1]。所以,像char *wer[2]这样的东西将是一个令人满意的定义,并且wer[1][1] == 'e'将起作用。

+0

我提高了这个,因为你实际上解释了会发生什么。 – 2010-01-26 19:02:13

+0

+ 1,Nicely解释:)。我的解决方案版本:'char wer [] [7] = {“dummy”,“he”};' – 2010-01-26 19:03:45

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

你不能像这样初始化一个指针。 – 2010-01-26 18:55:50

+0

已更正。往上看。 – 2010-01-26 19:03:09

+0

好现在... +1请问你是第一个回答:P – sud03r 2010-01-26 19:04:42

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

+1对于失败的测试,以及一个很好的解决方案:-) – JonH 2010-01-26 18:57:26

0

首先,在代码中,你所提到的参数的putChar()是

*(wer[1]+1) 

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

现在代码中的东西可以是 你没有清楚地提到e是什么意思,是一个字符或e是2.71 ...(自然对数基)在任何一种情况下,它应该很容易得到那个输出与此代码。

〜AD

-1

从视很迂腐点,没有正确答案的问题。这个问题是无效的。如果输出不以换行符结束,C语言本身不能保证程序的输出。见7.19.2/2

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

该程序输出到标准输出,这是一个文本流。这个程序的输出取决于实现,不管你用什么代替/* <something> */,这意味着这个问题对某些特定的平台可能是有意义的,但它作为一个抽象的C语言问题是没有意义的。

我高度怀疑,虽然你的考官从你:)))

+0

为什么C不保证输出不会以新队?你可以参考标准的章节吗? – 2010-03-05 02:59:38

+0

@Johannes Schaub:我指的是7.19.2/2,它指出文本流可能会在最后一行的末尾需要一个终止的换行符。它是否确实需要是实现定义的。 – AnT 2010-05-26 18:28:04

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; 
} 

的输出是:

[email protected]:~$ gcc really-silly-puzzle.c && ./a.out && echo 
e 
[email protected]:~$ 

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