我正在尝试在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]值。当我尝试这样做时,屏幕上出现错误'程序遇到问题,需要关闭'。
我该怎么做才能解决这个问题?
答案 0 :(得分:3)
您的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);
答案 1 :(得分:0)
因为strcpy声明中的这个错误:“char * * string1”
我认为你并不认为string1是指向char的指针。
删除其中一个*应该单词
答案 2 :(得分:0)
代码有几个问题:
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(N 2 ))。二次复杂度非常糟糕。复制1000个字符的字符串需要1000000次操作。如果要尝试效果,请使用线性和二次算法复制包含1000000个字符的字符串。strcpy()
未添加空终结符。int
规则不适用。也就是说,您确实需要在int
。main()
醇>
答案 3 :(得分:0)
好的,有几件事:
main
函数的返回类型
宣言。标准下并不是真的允许。有些编译器仍会允许它,但其他编译器会在编译时失败。for
循环的方式
strcpy
您每次都在调用strlen
函数
循环,它必须重新计算源中的字符
串。像“ABC”这样的字符串并没有什么大不了的,但随着字符串的到来
更长...更好地将结果的值保存到变量中并在for
循环i
的方式
`main'你指向只读存储,并将导致
访问违规请查看此处的其他答案,了解如何重建代码。
C和C ++中的指针使用是一个长期存在的问题。我想建议Paul DiLorenzo的以下教程,"Learning C++ Pointers for REAL dummies."。
(这并不是暗示你是一个“虚拟”,它只是对“插入主题在这里&gt;为傻瓜”系列书的引用。我不会感到惊讶的是,“REAL”的插入是防止商标所有权的诉讼)
这是一个很好的教程。
希望它有所帮助。