如何在C++中实现 strcpy 函数

How do I implement strcpy function in C++

本文关键字:实现 strcpy 函数 C++      更新时间:2023-10-16

所以我给了我这个标题

int mystrcpy(char *c, const char* s);

而且我必须自己实现 strcpy 函数。但是当我这样做并运行程序时,控制台停止工作,我认为这是内存地址违规的迹象。

我试过这个:

int mystrcpy(char *c, const char* s)
{
    int i=0;
    for(i=0;i<strlen(s);i++)
        c[i]=s[i];
    c[++i]=NULL;
    cout<<c;
    return 0;
}

完整代码:

#include<iostream>
#include<cstring>
using namespace std;
class Persoana
{
 char *nume;
 int an;
 float inaltime;
public:
 int my_strcpy(char *c, const char*s);
};

int Persoana::my_strcpy(char *c, const char* s)
{
 //code I need to insert
 return 0;
}
int main()
{
 Persoana a;
 cout << endl;
 cout<<a.my_strcpy("maria","george");
 return 0;
}

其他海报发布了strcpy的实现 - 为什么在C++代码中使用它?这是一个有趣的问题,因为C++很少使用C样式字符串

另一个问题是它的用法:

int main()
{
 Persoana a;
 cout << endl;
 cout<<a.my_strcpy("maria","george");
 return 0;
}

字符串"maria"和"george"是只读的。而是创建一个空的读/写字符串,如下所示,该字符串足够长 - 即 7 个字符(不要忘记空字符(

所以代码应该是

int main()
{
 Persoana a;
 char copy_of_string[7];
 cout << endl;
 cout<<a.my_strcpy(copy_of_string,"george");
 return 0;
}

循环本身是可以的(但效率低下,因为每次迭代都调用strlen()(。 真正的问题是当您在复制的字符串末尾插入空终止符时。 在插入终结器之前,您再次递增i。 别这样。 循环结束后,i 已经位于正确的索引处,因此只需按原样使用它:

int mystrcpy(char *c, const char* s);
{
    int i, len = strlen(s);
    for(i = 0; i < len; ++i)
        c[i] = s[i];
    c[i] = ''; // <-- NO ++ HERE!
    cout << c;
    return 0;
}

话虽如此,在不使用i的情况下实现strcpy的最简单方法如下:

int mystrcpy(char *c, const char* s)
{
    char *p = c;
    while (*p++ = *s++);
    cout << c;
    return 0;
}

如果删除cout则它变得更简单:

int mystrcpy(char *c, const char* s)
{
    while (*c++ = *s++);
    return 0;
}

无论如何,请确保在调用 mystrcpy() 时,c指向分配给至少 strlen(s)+1 个字符大小的 char[] 缓冲区,否则代码将具有未定义的行为

for 循环

for(i=0; i < strlen(s); i++)

当我<strlen(s(> 变为 false 时中止,当 i 等于 strlen(s( 时就是这种情况。因此,当循环结束时,这将是 i 的值。

如您所知,C 字符串以 NULL 结尾,因此您需要为 c 保留 strlen(s( + 1 个字节。由于您在写入"\0"字符之前再次递增 i,因此您使用的是从 c 开始的 strlen(s( + 2 个字节。

如果 c 恰好是所需的大小 (strlen(s( + 1(,则可能会导致访问冲突,因为写入时间超过分配内存的末尾。

所以而不是

c[++i]=NULL;

c[i]='';

希望这是有道理的!