C - 为什么strcpy()是必需的

时间:2011-08-01 15:58:02

标签: c string strcpy

有人可以向我解释为什么strcpy()是将字符串分配给字符数组所必需的,例如在下面的代码片段中。

int main(void) {

char s[4];

s = "abc"; //Fails
strcpy(s, "abc"); //Succeeds

return 0;
}

s = "abc"失败的原因是什么?为什么strcpy()是在声明字符串后将字符串赋值给char数组的唯一方法?我似乎很奇怪你必须使用一个函数来执行一个基本的赋值。

4 个答案:

答案 0 :(得分:28)

C中的数组是不可赋值和非可复制初始化的。这就是数组如何在C中。历史上,在值上下文中(在赋值的RHS上)数组衰减为指针,这正式地阻止了赋值和复制初始化。这适用于所有阵列,不仅适用于char阵列。

C语言从其前身--B和BCPL语言继承此数组行为。在这些语言中,数组由物理指针表示。 (显然,当你将一个数组分配给另一个数组时,指针的重新分配并不是你想要发生的。)在C语言中,数组不是指针,但它们通过衰减“模拟”B和BCPL数​​组的历史行为。在大多数情况下指向。这一历史遗产使C阵列至今无法复制。

上面的一个例外是使用字符串文字进行初始化。即你可以做到

char c[] = "abc";

但就是这样。

这意味着无论何时要复制数组,都必须使用库级存储器复制功能,如memcpystrcpy只是一种专门用于处理字符串的风格。

答案 1 :(得分:13)

这就是C中的数组。你无法分配它们。如果您愿意,可以使用指针:

char *p;
p = "abc";

顺便提一下,有C FAQ

  

阵列是C中的“二等公民”;一个结果就是这个   偏见是你不能分配给他们

答案 2 :(得分:1)

简答:历史原因。 C从未有过内置的字符串类型。直到C ++出现std :: string才出现,甚至没有第一次实现到来

答案很长:“abc”的类型不是char[],而是char *strcpy是一种机制,您可以使用该机制复制指针指向的数据(在本例中为ABC)。

strcpy不是初始化数组的唯一方法,但是,它足够聪明,可以检测并尊重字符串末尾的终止0。您还可以使用memcpy将字符串复制到s,但这需要传入要复制的数据长度,并确保{{1}中存在终止0(NULL) }

答案 3 :(得分:0)

C语言缺少任何方便的语法来获取指向字符串文字的指针以及其长度的指示。一些语言(包括许多Pascal方言)在每个字符串前面加上一个报告其长度的字节;这很好地用于许多目的,但将字符串文字限制为255个字符。 C的方法允许容纳任意长度的字符串文字,但无论长度如何,都只增加一个字节的开销。

对于几乎所有用途其他而言,零终止的字符串不如字符串文字那么差,但文字是迄今为止最常见的字符串形式,很多程序必须处理,因此,使图书馆功能有效地处理它们具有相当大的优势;然后,在它们不理想的情况下使用零终止字符串变得更容易,而不是为其他类型设置一组单独的库例程。