gpt4 book ai didi

c++ - 如何编写适用于两个动态数组的 strcat 函数

转载 作者:行者123 更新时间:2023-11-30 05:21:46 26 4
gpt4 key购买 nike

正如我们所知,strcat 函数将一个 c 字符串连接到另一个 c 字符串上,形成一个包含另外两个 c 字符串的大 c 字符串。

我的问题是如何制作一个与两个动态分配的数组一起工作的 strcat 函数。

所需的 strcat 函数应该能够适用于任何大小的 myStr1 和 myStr2

//dynamic c-string array 1
char* myStr1 = new char [26];
strcpy(myStr1, "The dog on the farm goes ");

//dynamic c-string array 2
char* myStr2 = new char [6];
strcpy(myStr2, "bark.");

//desired function
strcat(myStr1,myStr2);
cout<<myStr1; //would output 'The dog on the farm goes bark.'

这是我自己能做到的:

//*& indicates that the dynamic c-string str1 is passed by reference
void strcat(char*& str1, char* str2)
{
int size1 = strlen(str1);
int size2 = strlen(str2);
//unknown code
//str1 = new char [size1+size2]; //Would wipe out str1's original contents
}

谢谢!

最佳答案

您首先需要更好地理解指针的工作原理。例如你的代码:

char* myStr1 = new char [25];
myStr1 = "The dog on the farm goes ";

首先分配 25 个字符,然后忽略指向该分配区域的指针(技术术语是“泄漏它”)并将 myStr1 设置为指向字符串文字。

该代码应该使用 strcpy 而不是从字符串文字复制到分配的区域。除了该字符串是 25 个字符之外,因此您需要为至少 26 个字符分配空间,因为 ASCII NUL 终止符 (0x00) 需要一个空间。

该部分的正确代码应该是:

char* myStr1 = new char [26]; // One more than the actual string length
strcpy(myStr1, "The dog on the farm goes ");

要连接 C 字符串,算法可以是:

  1. 测量两个字符串的长度n1n2(with strlen)
  2. 为目标缓冲区分配n1+n2+1 个字符(C 字符串终止符需要+1)
  3. strcpy 缓冲区开头的第一个字符串
  4. strcat第二个字符串到缓冲区(*)
  5. delete[] 原始字符串缓冲区的内存如果不需要(这样做是否正确取决于谁是“所有者” "的字符串......这部分很棘手,因为 C 字符串接口(interface)没有指定)。

(*) 这不是最有效的方法。 strcat 将遍历字符串的所有字符以找到它的结束位置,但您已经知道第一个字符串的长度是 n1 并且连接可以用 strcpy 也通过选择正确的开始作为 buffer+n1。如果你知道 strcpy 的计数,你可以在任何地方使用 memcpy 而不是 strcpy 更好,因为它必须检查每个字符是否是 NUL 终止符。然而,在开始这种优化之前,您应该清楚地了解事情是如何工作的……只有当字符串连接代码正确并且对您来说完全显而易见时,您才有权开始考虑优化。

PS:一旦你获得了所有这些正确、有效和高效,你就会意识到使用 std::string 对象有多大的简化,所有这些复杂的代码都变成了 s1+s2.

关于c++ - 如何编写适用于两个动态数组的 strcat 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com