- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如我们所知,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 字符串,算法可以是:
n1
和n2
(with strlen
)n1+n2+1
个字符(C 字符串终止符需要+1
)strcpy
缓冲区开头的第一个字符串strcat
第二个字符串到缓冲区(*)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/
这个问题在这里已经有了答案: implicit declaration of function itoa is invalid in c99 (3 个答案) C strcat - warning:
这个问题在这里已经有了答案: Why do I first have to strcpy() before strcat()? (5 个答案) 关闭 3 年前。 如题,我做了一个demo来说明一下我
我在使用下面的程序时遇到问题。我正在尝试扫描用户输入的特定单词的字符串命令。我现在的主要问题是,当我运行以下命令时,我收到一条警告,指出“传递 ‘strcat’ 的 arg 2 使指针来自整数而不进行
我知道发生这个 valgrind 错误是因为我试图使用未初始化的东西。下面的代码是导致此错误的代码。它正在做的是尝试读取 Racket 代码并获取每个符号,例如 + 或 define。 (标记化)我不
原型 extern char *strcat(char *dest,char *src); 用法 &n
让我们举个例子。 #include #include int main() { char str1[7] = "hello "; printf("Initial size of s
我试图在不改变单词顺序的情况下颠倒一个句子, 例如:"Hello World"=> "olleH dlroW" 这是我的代码: #include #include char * reverseWo
根据Allocate string (char*) in another function我现在有这样的代码: void someFunction(char** string, char** arg
我想不通。当我在我的 Windows 机器上使用 Code::Blocks 编译这段代码时,它工作得很好,但是当我尝试在 Cygwin 或学校的实际 Unix 机器下使用 Make 编译它时,我得到下
我在一些遗留代码中发现了这一点。 static char title1[] = "SUMMARY REPORT"; static char title2[] = "PERIOD: "; ... str
我正在尝试使用 C 中的指针和 strcat。这是我学习过程的一部分。 想法是用户输入一个包含数字的字符串,输出应该只返回数字。所以,如果用户输入te12abc 输出应该是 12。 这是我的第一次尝试
在对字符串进行一些程序时,我遇到了这个小问题。他们向我提出的问题是——编写函数 strcat(s,t) 的指针版本,它将字符串 t 复制到 s 的末尾。我把程序写成这样 - #include void
我在 strcat 和段错误方面遇到了一些问题。错误如下: Program received signal EXC_BAD_ACCESS, Could not access memory. Reaso
当运行以下故意堆栈粉碎代码时,strcat 将 source 的值复制十次。 #include #include int main() { char a[16]; char b[1
我在 C 中有一个函数,我试图从两个不同的位置(未知大小,可能很大)获取字符串并将它们组合成一个字符串并返回它们。如果我只打印两个字符串,那么我会得到正确的结果,但是当我尝试使用 strcat 组合字
void mystrcat(char* to, const char* from) { while (*to) to++; while (*from) *to++ = *from++;
这是 295c 的问题之一 #include #include main() { char *a="kammo DJ";
我需要用 C 语言编写一个 strcat。我尝试了以下操作: char * c_strcat( char * str1, const char * str2) { char * ret
我正在从文件中读取行,并且我决定按 char 逐个读取 char 中的部分内容。这是我得到的: char str[500]; // it has to be this size, I promi
这个问题已经有答案了: Can I copy a string in an empty string? (3 个回答) 已关闭 8 年前。 自学C语言充满惊喜。我做这个简短的片段来测试 strcat(
我是一名优秀的程序员,十分优秀!