2011-10-31 470 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语句是不是放有一个更安全,并允许某些类型的使用检查。