问题描述
最早公开可用的C
标准似乎是1999年发布的ISO/IEC 9899:1999.strcpy
函数已经具有其当前语法.
The oldest publicly available C
standard seems to be the ISO/IEC 9899:1999, published in 1999.There the strcpy
function already has its current syntax.
我问这个问题的原因是,我发现了一个非常古老的系统,其中(strcpy的语法几乎与memcpy
相同.
The reason I ask it is that I found a really, really old system where (to my greatest shock) strcpy
seems to have almost the same syntax as memcpy
.
在这种实现中,strcpy的行为如下:
In that implementiation strcpy behaves like this:
-
strcpy(char *destination, char *source, int length)
的工作方式与现代的memcpy
-
strcpy(char *destination, char *source)
确实可以编译,但是没有任何明显的副作用,就像使用length = 0
调用它一样. -
strncpy
的工作原理与strcpy
完全相同,甚至可以仅使用2个参数进行编译.
strcpy(char *destination, char *source, int length)
works just like the modernmemcpy
strcpy(char *destination, char *source)
does compile, but it doesn't have any noticeable side-effect, just as if it was called withlength = 0
.strncpy
works exactly just likestrcpy
, it even compiles with just 2 parameters.
因此,对于对C考古学感兴趣(并且可以使用非常古老的标准)的人,是否存在未定义strcpy
的C标准?定义哪个第一个标准?我要处理的是非标准的编译器(甚至不符合最旧的C标准的编译器)吗?
So, for someone interested in C-archeology (and having access to very old standards), was there a C standard where strcpy
was not defined? Which was the first standard where it was defined? Am I dealing with a non-standard conforming compiler (a compiler that doesn't even conform to the oldest C standard)?
我找不到任何迹象表明应该真正实现哪个版本的C,唯一的提示是它是在1997年之前为富士通处理器编写的(因为我发现文字为"Copyright 1997").
I couldn't find any indication which version of C is really supposed to be implemented, the only hint is that it was written before 1997 (as I found the text "Copyright 1997") for a Fujitsu processor.
编辑:如果此来源是值得信赖的,strcpy
已经在1989年以其当前形式定义.所以我必须处理比我最初怀疑的还要古老的东西!
If this source is to be trusted, strcpy
was already defined in its current form already in 1989. So I have to deal with something even older than I first suspected!
推荐答案
C的第一个发布标准是C89(ANSI X3.159-1989).它对strcpy
的定义如下:
The first published standard for C was C89 (ANSI X3.159-1989). It defined strcpy
as follows:
char *strcpy(char *s1, const char *s2);
在此之前,请尝试寻找Kernighan和Ritchie编写的"The C Programming Language"的第一个版本,它是1978年至1989年发布时的事实上的标准.
Before, that, try looking for the first version of "The C Programming Language" by Kernighan and Ritchie, which was the de facto standard from its publication in 1978 to 1989. I would not be surprised if strcpy
predates this.
根据 http://cm.bell-labs.com/7thEdMan/, 1979年发布的第7版UNIX将strcpy定义为
According to http://cm.bell-labs.com/7thEdMan/, Version 7 UNIX, released in 1979, defined strcpy as
char *strcpy(s1, s2)
char *s1, *s2;
我无法在1975年发布的UNIX版本6的文档中找到strcpy
,但是由Dennis Ritchie编写的"C手册"中包含示例函数
I wasn't able to find strcpy
in the documentation for Version 6 UNIX, which was released in 1975, but its "C Manual", written by Dennis Ritchie, contained an example function
copy(s1, s2)
char *s1, *s2
{
while(*s2++ = *s1++);
}
Brian Kernighan编写的"C教程"包含以下版本:
Its "C Tutorial", written by Brian Kernighan, instead contained this version:
strcopy(s1, s2)
char s1[ ], s2[ ]; {
int i;
for( i = 0; (s2[i] = s1[i]) != '\0'; i++ );
}
这表明strcpy
的现代版本起源于1975年V6 UNIX的发布与1978年K& R C的发布之间.
This suggests that the modern version of strcpy
originated somewhere between the release of V6 UNIX in 1975 and the publication of K&R C in 1978.
请注意,即使在早期,我们也已经看到C的两个主要作者之间的风格差异:Kernighan将函数的开括号与参数声明放在同一行,而Ritchie则倾向于将其放在新行上本身.
Notice that even at this early time, we already see stylistic differences between the two principle authors of C: Kernighan put the opening bracket of functions on the same line as the parameter declaration, while Ritchie preferred to put it on a new line by itself.
这篇关于是否可以找到将strcpy的当前语法添加到C标准的时间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!