将指针中的值存储为数组-C++
Store value in Pointers as an Array - C++
我正试图在C++中创建一个类似strcpy
的函数。由于老师的限制,我无法使用内置的string.h函数。我做了以下功能:
int strlen (char* string)
{
int len = 0;
while (string [len] != (char)0) len ++;
return len;
}
char* strcpy (char* *string1, char* string2)
{
for (int i = 0; i<strlen (string2); i++) *string1[i] = string2[i];
return *string1;
}
main()
{
char* i = "Farid";
strcpy (&i, "ABC ");
cout<<i;
}
但是我无法设置*string1[I]值。当我尝试这样做时,屏幕上会出现一个错误"程序遇到问题,需要关闭"。
我应该怎么做才能解决这个问题?
您的strcpy
函数错误。当您编写*string1[i]
时,实际上是在修改一个假想字符串数组的第i个元素的第一个字符。该内存位置不存在,您的程序出现故障。
改为:
char* strcpy (char* string1, char* string2)
{
for (int i = 0; i<strlen (string2); i++) string1[i] = string2[i];
return string1;
}
如果传递char*
,则字符已可修改。注意:调用方负责分配内存以保存副本。声明:
char* i = "Farid";
不是有效的分配,因为i
指针可能指向只读内存。改为:
char i[100] = "Farid";
现在i
拥有100个字符的本地内存,为您的副本提供了充足的空间:
strcpy(i, "ABC ");
如果你想让这个函数分配内存,那么你应该创建另一个,比如strdup()
:
char* strdup (char* string)
{
size_t len = strlen(string);
char *n = malloc(len);
if (!n)
return 0;
strcpy(n, string);
return n;
}
现在,通过这个函数,调用者有责任释放内存:
char *i = strdup("ABC ");
//use i
free(i);
因为strcpy声明中的这个错误:"char**string1"
我不认为您的意思是string1是指向char的指针。
删除其中一个*should单词
代码有几个问题:
- 无法将字符串文字分配给
char*
,因为该字符串文字的类型为char const[N]
(适用于合适的值N
),它会转换为char const*
,但不会转换为char*
。在C++03中,为了向后兼容,可以转换为char*
,但现在这个规则已经不存在了。也就是说,您的i
需要声明为char const*
。如上所述,您的代码试图写入只读内存,这将产生不良影响 std::strcpy()
的声明采用char*
和char const*
:对于第一个指针,您需要提供足够的空间来容纳第二个参数的字符串。由于这很容易出错,因此首先使用strcpy()
是个坏主意!相反,您希望复制std::strncpy()
,它将第一个缓冲区的长度作为第三个参数(实际上,我永远不确定std::strncpy()
是否保证零终止;您肯定也希望保证零终止)- 在循环条件中使用
strlen()
是个坏主意,因为循环的每次迭代都需要评估函数,从而有效地将strlen()
的复杂度从线性(O(N))更改为二次(O(N2).)。二次复杂性非常糟糕。复制一个1000个字符的字符串需要1000000次操作。如果你想尝试这种效果,可以使用线性和二次算法复制一个包含1000000个字符的字符串 - 您的
strcpy()
没有添加null终止符 - 在C++中(以及自1990年以来的C中),隐式
int
规则不适用。也就是说,您确实需要在main()
前面写int
好吧,有几件事:
- 您缺少
main
函数的返回类型公告根据标准,这是不允许的。某些编译器仍然允许它,但其他编译器在编译时会失败 for
循环的结构方式strcpy
您每次通过调用strlen
函数循环,并且必须重新计数源中的字符一串像"ABC"这样的字符串没什么大不了的,但字符串比较长的最好将结果的值保存到变量中,并在for
循环中使用- 因为您在中声明
i
的方式`main,您指向的是只读存储,并且将导致访问违规
关于如何重新生成代码,请查看此处的其他答案。
指针在C和C++中的使用是一个长期存在的问题。我想推荐Paul DiLorenzo的以下教程,"为真实假人学习C++指针"。
这是一个很好的教程。
希望能有所帮助。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '