如标题所述,目标是将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风格的字符串。
答案 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))
。这里,p
或i
中的一个是指向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()
例程的逻辑可以内联移动,并且可以使用更多惯用表达式,其中指针增量可以在复制数据的表达式中发生(但我认为这对初学者来说更加混乱)。