C中的Strcpy实现

时间:2013-01-23 09:47:02

标签: 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从源位置复制到目的地。

我也看过这个版本:

// Move the assignment into the test
void strcpy2(char dest[], const char source[]) 
{
    int i = 0;
    while ((dest[i] = source[i]) != '\0')
    {
        i++;
    } 
}

对我而言,在尝试将\0source分配到dest时,它会中断。

什么是正确的选项,是否复制\0

8 个答案:

答案 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

,那就是你必须要做的