所以,我在C:
中看到了这个strcpy
实现
void strcpy1(char dest[], const char source[])
{
int i = 0;
while (1)
{
dest[i] = source[i];
if (dest[i] == '\0')
{
break;
}
i++;
}
}
对我而言,它甚至会将\0
从源位置复制到目的地。
我也看过这个版本:
// Move the assignment into the test
void strcpy2(char dest[], const char source[])
{
int i = 0;
while ((dest[i] = source[i]) != '\0')
{
i++;
}
}
对我而言,在尝试将\0
从source
分配到dest
时,它会中断。
什么是正确的选项,是否复制\0
?
答案 0 :(得分:6)
代码应如下所示:
char * strcpy(char *strDest, const char *strSrc)
{
assert(strDest!=NULL && strSrc!=NULL);
char *temp = strDest;
while(*strDest++ = *strSrc++); // or while((*strDest++=*strSrc++) != '\0');
return temp;
}
您可以不删除第二行char *temp = strDest;
并直接返回strDest
。这将导致返回的内容出错。例如,它不会返回正确的值(应该是22)将检查返回的char *
的长度。
char src_str[] = "C programming language";
char dst_str[100];
printf("dst_str: %d\n", strlen(strcpy(dst_str, src_str)));
答案 1 :(得分:4)
两者都复制终止符,因此两者都是正确的。
请注意strcpy2()
首先进行分配(复制),然后进行比较。所以它会在实现它之前复制终结器并停止。
另请注意,名称以str
开头的函数是保留的,因此这些函数实际上都不是“用户级”代码。
答案 2 :(得分:2)
你错了。两者都复制\0
(NUL终结符)字符。你必须总是复制NUL终结者字符,否则你的字符串就会被破坏:你永远不会知道它何时/何地结束。
答案 3 :(得分:0)
strcpy1()
和strcpy2()
都是一样的。两者都将NUL字符复制到目标数组的末尾。
答案 4 :(得分:0)
char * strcpy(char *strDest, const char *strSrc)
{
assert(strDest!=NULL && strSrc!=NULL);
assert(strSrc + strlen(strSrc) < d || strSrc > strDest); // see note
char *temp = strDest;
while(*strDest++ = *strSrc++);
return temp;
}
//如果不检查第4行,新字符串将覆盖旧字符串,包括空目标分隔符,导致副本无法停止。
答案 5 :(得分:0)
这是完整的实施。您不必在第一个字符串的末尾考虑\ 0,它将根据逻辑从第二个字符串自动复制
//str copy function self made
char *strcpynew(char *d, char *s){
char *saved = d;
while ((*d++ = *s++) != '\0');
return saved; //returning starting address of s1
}
//default function that is run by C everytime
int main(){
//FOR STRCPY
char s1[] = "rahul"; //initializing strings
char s2[] = "arora"; //initializing strings
strcpynew(s1, s2);
printf("strcpy: %s\n", s1); //updated string after strcpy
}
答案 6 :(得分:0)
两者都复制终止符,因此两者都是正确的。
strcpy2()先进行复制,然后进行比较。因此它将复制终结符并停止。
名称以str开头的函数是保留的,因此请使用任何其他变量或命名类型
答案 7 :(得分:-3)
两者都复制'\ 0'。如果你想完全模仿原始的strcpy
,那就是你必须要做的