如标题所述,目标是在不使用任何标准库函数或下标的情况下将 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 风格的字符串。
最佳答案
C 风格的字符串以 '\0' 结尾。需要一个字符一个字符遍历函数内部的字符串,直到遇到'\0'才知道有多长。 (这实际上就是您通过调用 strlen() 来计算它所要做的事情。)一旦知道字符串的长度,就可以分配正确的内存量,即长度 +1(因为 '\0 ').
要访问数组 p 的第 i 个元素,请使用下标:p[i]
。
p[i]
形式的下标被 C 标准(6.5.2.1 of C99) 和 C++ 标准(C99 的 5.2.1)。这里,p
或i
其中一个是指向T的指针类型,另一个是整数类型(或者C++中的枚举)。因为数组名称自动转换(在大多数类型的使用中)为指向所述数组第一个元素的指针,因此 p[i]
是数组 p 的第 i 个元素。
就像基本算术一样,((p)+(i))
等同于指针算术中的((i)+(p))
。这意味着 *((p)+(i))
等同于 *((i)+(p))
。这也意味着 p[i]
等同于 i[p]
。
关于c++ - 仅使用取消引用将 C 样式字符串复制到免费存储区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263447/