我正在尝试在C ++中实现自己的str concat函数,但是没有将我的指针变量之一分配给另一个指针值。当我在CLION中调试程序时,它将带我到行*p = *s2
,并将*p
变量分配给\0
而不是b
。我不确定此错误来自何处,还可以在cLion中进一步调试该方法获得帮助吗?
我尝试将参数中的第二个char指针更改为const,并搜索EXC_BAD_ACCESS (code=2, address=0x10c226edd)
的答案。
char * my_strcat(char* s1, char* s2)
{
if(s1 == NULL || s2 == NULL) {
return NULL;
}
char *p = s1;
while (*p != '\0')
{
p++;
}
while (*s2 != '\0')
{
*p = *s2;
p++;
s2++;
}
*p = '\0';
return s1;
}
char *arr4 = "Taco";
char *arr5 = "bean";
std::cout << my_strcat(arr4,arr5) << std::endl;
预期的结果是arr4
和arr5
的连接,实际结果没有打印。
答案 0 :(得分:1)
问题是字符串文字不可修改。 C字符串也不会自动增长以适应添加到其中的字符。试试这个吧。
char arr4[100] = "Taco";
现在arr4
实际上是一个数组,它有足够的空间供您向字符串中添加95个以上的字符。
我认为您需要修改指针与数组之间的区别,这是新手感到困惑的一个非常常见的话题。
答案 1 :(得分:0)
忽略you are invoking undefined behavior in your code by trying to modify a string literal一秒钟的事实,您还有另一个问题。即使char*
部分按预期工作,您仍尝试写入未分配的数据。
原因是p
= s1
。这意味着p
在该地址分配的数据量与s1
相同。为什么这很重要?好吧,当您尝试这样做时:
while (*s2 != '\0')
{
*p = *s2;
p++;
s2++;
}
您正在进入一个未分配的空间,因为p
现在指向经过s1
分配的位置。 That's also undefined behavior,并可能导致崩溃。
您确实需要修复这两个错误。使您的程序正常运行。
我的建议是改用std::string
:
std::string s1 = "Taco";
std::string s2 = "bean";
std::cout << s1+s2 << std::endl;
容易得多!
顺便说一句,我推荐reading this question,特别是this answer to that question(如果您打算串联2个字符数组)以获取有关您要执行的操作的更多信息。