2010-01-26 26 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'的最短代碼?