5

所以,我strcpy在 C 中看到了这个实现:

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++;
    } 
}

对我来说,在尝试分配\0from sourceto时它会中断dest

什么是正确的选择,复制\0与否?

4

9 回答 9

7

代码应如下所示:

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)));
于 2013-11-25T11:03:17.497 回答
4

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

请注意,strcpy2()首先进行分配(复制),然后进行比较。所以它会在意识到它之前复制终结器并停止。

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

于 2013-01-23T09:49:58.373 回答
2

你错了。两者都复制\0(NUL 终止符)字符。您必须始终复制 NUL 终止符,否则您的字符串将被破坏:您永远不知道它何时/何​​地结束。

于 2013-01-23T09:49:22.147 回答
1

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

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

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

于 2017-10-05T06:48:51.543 回答
0

两者都strcpy1()strcpy2()同样的事情。两者都将 NUL 字符复制到目标数组的末尾。

于 2013-01-23T09:59:11.387 回答
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 行,新字符串会覆盖旧字符串,包括空分隔符,导致复制无法停止。

于 2016-05-11T02:35:36.003 回答
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
}
于 2017-02-08T09:04:16.213 回答
0

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

    void StrCopy( char* _dst, const char* _src )
    {
       while((*_dst++ = *_src++));
    }
于 2018-02-24T20:34:39.207 回答
-3

两者都复制'\0'。如果您想完全模拟原始 strcpy,这就是您必须做的事情

于 2013-01-23T09:49:32.267 回答