2011-10-31 57 views
2

我已在Delphi中成功完成了AQA計算考試(2011年6月)。出於好奇,我讀了它的標記方案。有一件事我不明白,C語言標記方案在很多方面似乎都是錯誤的。幸運的是(哈!)我在德爾福做過。標記計劃

例如,該小片段:

char* Names[5]; 
... 
void main(void) 
{ 
    Names[1] = "Ben"; 
    Names[2] = "Thor"; 
    Names[3] = "Zoe"; 
    Names[4] = "Kate"; 
    ... 
} 

其一,它無法將字符串分配給數組。必須使用像strcpy這樣的函數。此外,爲什麼數組從1開始,即使分配了5個條目?大多數編程語言,包括C,從0開始。

還有其他的問題,比如他們使用printf("%s", "message");打印字符串;放置會很好。如果你可以確定沒有未轉義的百分號會出現在信息中,那麼printf也是如此,沒有任何參數。

我在批評我呢?

注:對於那些不熟悉的標記方案,它們是什麼用來標記考試。我在質疑這是否正確。

+0

什麼使你認爲main()返回void? – wildplasser

+0

@wildplasser:不知道 - 這是標記方案。 –

+0

我不知道Mark方案是什麼。你的問題是什麼? – wildplasser

回答

3

啓動索引1是怪異,而主要不使用C返回void,但數組賦值是有效的。 Names是一個指針數組,「Ben」看起來像一個字符串指針。僅當您想將字符串複製到爲其分配的空間時,才需要使用strcpy。如果編譯器不太挑剔並且沒有運行時問題,那麼該程序仍會編譯,除非有人提到Names[5]

printf的東西實際上更好。 puts是不好的juju,正如你所指出的,你不能確定字符串中沒有未轉義的%

+0

如果嘗試修改數組中的字符串,會發生問題嗎? –

+0

@ThomasO:是的,他們會的。這些字符串可能被分配在只讀存儲器中,其餘常量(我不記得標準是否保證)如果有人說'名稱[3] [2] ='F'',那麼可能會發生如此糟糕的事情。 – nmichaels

1

首先,它不可能爲字符串分配給數組。

這種說法是由一個大的正確。但是,這不是代碼中發生的事情。發生什麼是指針分配。您可以將一個字符串的地址(它是一個指針)分配給另一個指針,該指針恰好是數組的一個元素。

爲什麼數組從1開始

也許代碼是從另一種語言(BASIC?)。也許這裏的目標儘可能接近翻譯,以便可以輕鬆比較不同語言的解決方案。

0

其實你的理解在這種情況下是錯誤的。

的名稱陣列被定義爲字符指針的陣列。 「Ben」,「Thor」等都是字符指針,因此可以合法地分配給任何Names數組條目。

是第一元件是在0指數,但它們可以不希望的代碼這一點。也許他們會問第一個元素會有什麼樣的價值 - 在這種情況下,它會被未使用,因此取決於編譯器的未定義值。

而且在printf語句是不是放有一個更安全,並允許某些類型的使用檢查。