Strcpy在C中的实现

Strcpy在C中的实现,c,strcpy,C,Strcpy,因此,我在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从源复制到目标 我也看

因此,我在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
(NUL终止符)字符。您必须始终复制NUL终止符,否则字符串将被破坏:您永远不知道它何时/何地结束。

两者都复制'\0'。如果要完全模拟原始strcpy,必须这样做,因为两者都复制了终止符,因此都是正确的

请注意,
strcpy2()
首先进行赋值(复制),然后进行比较。因此,它会在意识到之前复制终结者,然后停止


另外,请注意,名称以
str
开头的函数是保留的,因此这两个函数实际上都不是有效的“用户级”代码。

strcpy1()和
strcpy2()
都是这样做的。两者都将NUL字符复制到目标数组的末尾。

代码应如下所示:

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)));
char*strcpy(char*strDest,const char*strSrc)
{
断言(strDest!=NULL&&strsrrc!=NULL);
断言(strSrc+strlen(strSrc)strDest);//参见注释
char*temp=strDest;
而(*strDest++=*strSrc++);
返回温度;
}

//如果没有第4行上的检查,新字符串将覆盖旧字符串,包括null清除器,导致复制无法停止。

以下是完整的实现。您不必在第一个字符串的末尾考虑“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
}

两者都复制终止符,因此都是正确的

strcpy2()首先进行复制,然后进行比较。因此,它将复制终止符并停止


名称以str开头的函数是保留的,因此使用任何其他变量或命名类型

您可以使用此代码,越简单越好! 在while()中,我们逐字符复制字符,并将指针移动到下一个字符。当最后一个字符\0通过并复制时,同时接收0并停止

    void StrCopy( char* _dst, const char* _src )
    {
       while((*_dst++ = *_src++));
    }

复制空终止符是正确的。两个版本都会这样做。当
\0
上中断时,副本已经由
dest[i]=source[i]
@simonc完成-您的注释将是正确的答案
'\0'
指示字符串的结尾,它应该在那里,否则您将不知道字符串的结尾。因此(dest[i]的最后一个赋值=源[i])返回“\0”?我认为赋值总是返回“1”或true(如果赋值正确)。@赋值根据赋值进行计算。我一点也不知道你说的“正确分配”是什么意思。“错误分配”的例子是什么?我认为这个概念在C中并不存在。根据C 2011 7.31.12和.13,只保留以“str”开头的名称和小写字母。如果strcpy函数中dest的大小未知,该怎么办?如何进行安全复制?有没有比上述更好的方法?请注意:在您的示例中,您存储
dest
字符串的开头,以避免在复制完成后返回其结尾,这是正确的,但是他的函数(具有返回类型
void
和)按值传递参数,因此(本地)指针算法不会影响外部的指针,因此
temp
(即起始地址)不是必需的,不是吗?虽然此代码片段可能是解决方案,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
    void StrCopy( char* _dst, const char* _src )
    {
       while((*_dst++ = *_src++));
    }