所以我有这个标题给我
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;
}
答案 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;
希望这是有道理的!