仅使用取消引用将C样式字符串复制到自由商店

时间:2009-08-11 23:01:25

标签: c++ c pointers heap

如标题所述,目标是将C风格的字符串复制到内存中,而不使用任何标准库函数或下标。

这是我到目前为止[已解决]

#include "std_lib_facilities.h"

char* strdup(const char* p)
{
    int count = 0;
    while (p[count]) ++count;
    char* q = new char[count+1];
    for (int i = 0; i < count + 1; ++i) *(q + i) = *(p + i);
}

int main()
{
    char word[] = "Happy";

    char* heap_str = strdup(word);
}

显然问题是仅分配*p(相当于p[0])只会将字母"H"分配给内存。我不知道如何在没有下标或STL函数的情况下分配C风格的字符串。

2 个答案:

答案 0 :(得分:6)

C风格的字符串以'\ 0'结尾。你需要逐个遍历函数中的字符串,直到你遇到'\ 0'来知道它有多长。 (这实际上是通过调用strlen()来完成的。)一旦你知道字符串有多长,就可以分配适当的内存量,即长度+ 1(因为'\ 0' “)。

要访问数组p的第i个元素,可以使用下标:p[i]

形式p[i]的下标由C标准(C99的6.5.2.1)和C ++标准(C99的5.2.1)正式定义为*((p)+(i))。这里,pi中的一个是指向T的类型指针,另一个是整数类型(或C ++中的枚举)。因为数组名称被自动转换(在大多数使用类型中)到指向所述数组的第一个元素的指针,因此p[i]是数组p的第i个元素。

就像基本算术一样,((p)+(i))在指针算术中等同于((i)+(p))。这意味着*((p)+(i))相当于*((i)+(p))。这也意味着p[i]相当于i[p]

答案 1 :(得分:1)

嗯,因为这是一个自学教学练习,这里是一个可以与KTC对下标和指针算术之间的等价性的良好解释进行比较/对比的解决方案。

问题似乎是“在不使用标准库工具或下标的情况下实现strdup()功能”。

我将为malloc()做一个例外,因为如果没有它,没有合理的方法可以做到这一点,我认为使用它并不会对所教的内容产生不利影响。

首先,让我们做一个strdup()的基本实现,调用与我们可能在库中使用的函数类似的函数:

size_t myStrlen( char* s);
void myStrcpy( char* dst, char* src);

char* strdup( char* p)
{
    size_t len = myStrlen( p);

    char* dup = (char*) malloc( len + 1);   /* include space for the termination character */

    if (dup) {
        myStrcpy( dup, p);
    }

    return dup;
}

现在让我们实现工作者函数而无需下标:

size_t myStrlen( char* s)
{
    size_t len = 0;

    while (*s != '\0') {  /* when s points to a '\0' character, we're at the end of the string */
        len += 1;

        s += 1; /* move the pointer to the next character */
    }

    return len;
}


void myStrcpy( char* dst, char* src)
{
    while (*src != '\0') {  /* when src points to a '\0' character, we're at the end of the string */
        *dst = *src;

        ++dst;  /* move both pointers to next character location */
        ++src;
    }

    *dst = '\0'; /* make sure the destination string is properly terminated */
}

你有它。我认为这满足了赋值的条件,并显示了如何操作指针来移动数组项而不是使用下标。当然,如果需要,myStrlen()myStrcpy()例程的逻辑可以内联移动,并且可以使用更多惯用表达式,其中指针增量可以在复制数据的表达式中发生(但我认为这对初学者来说更加混乱)。