所以我给了我这个标题
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]=' ';
希望这是有道理的!