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

时间:2013-12-11 22:04:06

标签: c++ pointers

我正在尝试在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]值。当我尝试这样做时,屏幕上出现错误'程序遇到问题,需要关闭'。

我该怎么做才能解决这个问题?

4 个答案:

答案 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)

代码有几个问题:

  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(N 2 )。二次复杂度非常糟糕。复制1000个字符的字符串需要1000000次操作。如果要尝试效果,请使用线性和二次算法复制包含1000000个字符的字符串。
  4. 您的strcpy()未添加空终结符。
  5. 在C ++中(以及在1990年以来的C中)隐式int规则不适用。也就是说,您确实需要在int
  6. 前面写main()

答案 3 :(得分:0)

好的,有几件事:

  1. 您缺少main函数的返回类型 宣言。标准下并不是真的允许。有些编译器仍会允许它,但其他编译器会在编译时失败。
  2. 您构建for循环的方式 strcpy您每次都在调用strlen函数 循环,它必须重新计算源中的字符 串。像“ABC”这样的字符串并没有什么大不了的,但随着字符串的到来 更长...更好地将结果的值保存到变量中并在for循环
  3. 中使用它
  4. 由于您宣布i的方式 `main'你指向只读存储,并将导致 访问违规
  5. 请查看此处的其他答案,了解如何重建代码。

    C和C ++中的指针使用是一个长期存在的问题。我想建议Paul DiLorenzo的以下教程,"Learning C++ Pointers for REAL dummies."

    (这并不是暗示你是一个“虚拟”,它只是对“插入主题在这里&gt;为傻瓜”系列书的引用。我不会感到惊讶的是,“REAL”的插入是防止商标所有权的诉讼)

    这是一个很好的教程。

    希望它有所帮助。