将指针中的值存储为数组-C++

Store value in Pointers as an Array - C++

本文关键字:数组 -C++ 存储 指针      更新时间:2023-10-16

我正试图在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单词

代码有几个问题:

  1. 无法将字符串文字分配给char*,因为该字符串文字的类型为char const[N](适用于合适的值N),它会转换为char const*,但不会转换为char*。在C++03中,为了向后兼容,可以转换为char*,但现在这个规则已经不存在了。也就是说,您的i需要声明为char const*。如上所述,您的代码试图写入只读内存,这将产生不良影响
  2. std::strcpy()的声明采用char*char const*:对于第一个指针,您需要提供足够的空间来容纳第二个参数的字符串。由于这很容易出错,因此首先使用strcpy()是个坏主意!相反,您希望复制std::strncpy(),它将第一个缓冲区的长度作为第三个参数(实际上,我永远不确定std::strncpy()是否保证零终止;您肯定也希望保证零终止)
  3. 在循环条件中使用strlen()是个坏主意,因为循环的每次迭代都需要评估函数,从而有效地将strlen()的复杂度从线性(O(N))更改为二次(O(N2.)。二次复杂性非常糟糕。复制一个1000个字符的字符串需要1000000次操作。如果你想尝试这种效果,可以使用线性和二次算法复制一个包含1000000个字符的字符串
  4. 您的strcpy()没有添加null终止符
  5. 在C++中(以及自1990年以来的C中),隐式int规则不适用。也就是说,您确实需要在main()前面写int

好吧,有几件事:

  1. 您缺少main函数的返回类型公告根据标准,这是不允许的。某些编译器仍然允许它,但其他编译器在编译时会失败
  2. for循环的结构方式strcpy您每次通过调用strlen函数循环,并且必须重新计数源中的字符一串像"ABC"这样的字符串没什么大不了的,但字符串比较长的最好将结果的值保存到变量中,并在for循环中使用
  3. 因为您在中声明i的方式`main,您指向的是只读存储,并且将导致访问违规

关于如何重新生成代码,请查看此处的其他答案。

指针在C和C++中的使用是一个长期存在的问题。我想推荐Paul DiLorenzo的以下教程,"为真实假人学习C++指针"。

这是一个很好的教程。

希望能有所帮助。