如何在C++中实现 strcpy 函数
How do I implement strcpy function in 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;
}
其他海报发布了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]=' ';
希望这是有道理的!
- 如果没有malloc,链表实现将失败
- 使用strcpy将char数组的元素复制到另一个数组
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如何在C++中实现 strcpy 函数