现在这是我从一些试卷中得到的一个愚蠢的谜题,遗憾的是我无法在过去的15分钟内弄明白。
#include <stdio.h>
int main(void){
/* <something> */
putchar(*(wer[1]+1));
return 0;
}
为了获得输出e
,我们应该替换什么代替。现在我们知道putchar
将int
作为参数但是这段代码假定给出一个指针。这个问题甚至有效吗?
答案 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语言问题毫无意义。
我非常怀疑你的审查员是否期待你的这种迂腐:)))