gpt4 book ai didi

c - malloc() 将 2 个字符串连接成第三个字符串 - 编译后崩溃

转载 作者:行者123 更新时间:2023-12-02 08:34:00 27 4
gpt4 key购买 nike

所以我正在学习“Sams 每天一小时自学 C 编程,第七版”第 10 课练习 7,其中要求“编写一个接受两个字符串的函数。使用 malloc() 函数分配足够的内存在连接(链接)后保存两个字符串。返回指向这个新字符串的指针。”

我确信有比我在下面尝试的方法更优雅的方法来解决这个问题。我最感兴趣的是为什么我的解决方案不起作用。我只学了几个月的 C,没有重要的编程背景。请让我知道为什么这会在编译时崩溃。我在 Win 7 上使用 Code Blocks 和 GNU GCC Compiler 如果这有区别的话。谢谢:)

#include <stdio.h>
#include <stdlib.h>
char * concatenated(char array1[], char array2[]);
int ctrtotal;

int main(void)
{
char *comboString;
char *array1 = "You\'re the man ";
char *array2 = "Now Dog!";
comboString = (char *)malloc(ctrtotal * sizeof(char));

concatenated(array1, array2);

if (comboString == NULL)
{
puts("Memory error");
exit(1);
}
puts(comboString);
free(comboString);

return 0;
}

char * concatenated(char array1[], char array2[])
{
char *array3;
int ctr;
int ctr2;

for (ctr = 0; array1[ctr] != '\0'; ctr++)
array3[ctr] = array1[ctr];

ctr2 = ctr;

for (ctr = 0; array2[ctr] != '\0'; ctr++)
{
array3[ctr2 + ctr] = array2[ctr];
}

array3[ctr2 + ctr + 1] = '\0';
ctrtotal = (ctr2 + ctr + 2);

return array3;
}

谢谢你的帮助。在查看了每个人对我的错误的反馈后,我将代码修改为以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * concatenated(char array1[], char array2[]);

int main(void)
{
char *array1 = "Testing Testing One Two ";
char *array2 = "Three. Finally, not crashing the mem o ry.";
char *comboString = malloc( (strlen(array1)+strlen(array2) + 1)*sizeof(char));

comboString = concatenated(array1, array2);

if (comboString == NULL)
{
puts("Memory error");
exit(1);
}

puts(comboString);
free(comboString);

return 0;
}

char * concatenated(char array1[], char array2[])
{
char *array3;
array3 = malloc( (strlen(array1)+strlen(array2) + 1)*sizeof(char) );

strcat(array3, array1);
strcat(array3, array2);

return array3;
}

如果有人看到任何冗余/不必要的剩余代码可以/应该删除,请告诉我。我认识到尽可能简洁的好处。

最佳答案

您的代码有很多问题:

  • int ctrtotal 从未被初始化,所以你正在 mallocing 0 字节
  • concatenated() 正在将字符复制到一个未初始化 array3。此指针应指向一个 mallocd 缓冲区。
  • 如果 concatenated 正在分配内存,则 main 不需要。相反,它应该使用 concatenated 的结果。

我不想给你完整的代码,让你错过这次学习的机会。所以 concatenated 在伪代码中应该是这样的:

count = length_of(string1) + length_of(string2) + 1
buffer = malloc(count)
copy string1 to buffer
copy string2 to buffer, after string1
set the last byte of buffer to '\0' (NUL)
return buffer

在 C 中,字符串表示为 NUL-terminated array of characters .这就是我们分配一个额外字节并以 \0 终止它的原因。


作为旁注,在处理字符串时,使用指针比将它们视为数组并通过索引访问它们要容易得多。

这里有很多没有任何意义的代码。我建议您先将此程序写在纸上。然后,在脑海中“执行”程序,逐步执行每一行。如果您遇到不理解的事情,那么您需要修正您的理解或错误的代码。不要试图编写看起来像其他代码的代码。


还有一个名为 strcat 的库函数这将使这项任务更加容易。看看您是否可以在这里弄清楚如何使用它。

Spoiler -->                                                                                         #include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *concatenate2(const char* s1, const char* s2);

int main(void)
{
char *comboString;
char *array1 = "You're the man ";
char *array2 = "Now Dog!";

comboString = concatenate2(array1, array2);

if (comboString == NULL)
{
puts("Memory error");
exit(1);
}
puts(comboString);
free(comboString);

return 0;
}

char *concatenate2(const char* s1, const char* s2)
{
char *result;

result = malloc(strlen(s1) + strlen(s2) + 1);

*result = '\0';

strcat(result, s1);
strcat(result, s2);

return result;
}

关于c - malloc() 将 2 个字符串连接成第三个字符串 - 编译后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642019/

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