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

时间:2018-03-21 18:21:06

标签: c++

所以我有这个标题给我

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

3 个答案:

答案 0 :(得分:1)

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

另一个问题是它的用法:

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

 return 0;
}

字符串&#34; maria&#34;和&#34;乔治&#34;是只读的。而是创建一个空的读/写字符串,如下所示,足够长 - 即7个字符(不要忘记空字符)

所以代码应该是

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

 return 0;
}

答案 1 :(得分:0)

你的循环本身没问题(但效率很低,因为你在每次迭代时调用Caused by: java.lang.ClassCastException: net.sf.jasperreports.engine.JREmptyDataSource cannot be cast to net.sf.jasperreports.engine.data.JRXmlDataSource )。真正的问题是当您在复制的字符串末尾插入空终止符时。在插入终结符之前,您再次递增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] = '\0'; // <-- NO ++ HERE! cout << c; return 0; } 的情况下实施strcpy的最简单方法如下:

i

如果删除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缓冲区的大小至少为char[]个字符,否则代码将具有未定义的行为

答案 2 :(得分:-2)

for循环

PS D:\> & ./t.ps1 *>> .\out.log

PS D:\> gc .\out.log
host msg
i&lt; 时,

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

如您所知,C字符串以NULL结尾,因此您需要为c保留 strlen(s)+ 1 个字节。因为你在写'&0 39; \ 0&#39;之前再次增加i。字符,您从c开始使用 strlen(s)+ 2 字节。

如果c正好是所需的大小( strlen(s)+ 1 ),那么可能会导致访问冲突,因为你&#39 ;写完分配内存的结尾。

所以而不是

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

c[++i]=NULL;

希望这是有道理的!