我正在尝试连接两个字符串文字指针,并将它们存储在第三个字符串中,该字符串动态分配内存以适应两个字符串,最后添加并打印出字符串char。我无法在函数外部打印字符串。
//Here is the function
void join(char ptr1, char ptr2, char **ptr3) {
char tempStr[strlen(strPtr1) + strlen(strPtr2)+1];
strcpy(tempStr, ptr1);
strcat(tempStr, ptr2);
*ptr3 = (char*)malloc(strlen(tempStr));
strcpy(ptr3, tempStr);
printf("%s\n", ptr3);
}
主要是我有这些变量
char *str1 = "print "; char *str2= "out"; char *str3;
join(str1,str2,&(str3));
printf("%s",str3)://segmentation fault occur here
我已经问了类似的question指针操作,我仍然在努力解决这些问题。
答案 0 :(得分:1)
如果这是C,则忽略了字符串末尾的'\ 0'。试试这个
height
另外,为什么不返回新字符串而不是传入对ptr3的引用?
答案 1 :(得分:1)
您发布的代码中的问题是该行
for(var i = 1; i < GlobalObject[0].length; i++) {
var opt = GlobalObject[0][i];
var subString = opt.substring(opt.length - 4, opt.length);
if (i != GlobalObject[0].length -1 ) {
var opt2 = GlobalObject[0][i+1];
var subString2 = opt2.substring(opt2.length - 4, opt2.length);
}
else {}
if (subString != "0000") {
var el = document.createElement("option");
el.textContent = "\u00A0" + "\u00A0" + "\u00A0" + "\u00A0" + "\u00A0" + opt;
el.value = opt;
newOptGroup.appendChild(el);
}
else {
var newOptGroup = document.createElement("OPTGROUP");
newOptGroup.label = opt;
newOptGroup.value = opt;
}
if (subString2 == "0000" || i == GlobalObject[0].length-1 ) {
console.log("here");
ChannelList.add(newOptGroup);
}
}
应该是
*ptr3 = (char*)malloc(strlen(tempStr));
原因与您需要在行中使用 *ptr3 = (char*)malloc(strlen(tempStr) + 1);
的原因相同:
+1
您可以通过不将char tempStr[strlen(ptr1) + strlen(ptr2)+1];
创建为临时对象来简化功能。
tempStr
答案 2 :(得分:0)
您遇到的一个问题是,您将ptr1 ad ptr2声明为字符而不是指针。
你有什么理由不能使用sprintf()?
std::string(const char*)
答案 3 :(得分:0)
编译器警告未完全启用。有了良好的编译器和警告,编译器会发出警告。这可以节省您的时间并避免不必要的帖子。
void join(char *ptr1, char *ptr2, char **ptr3) {
...
// warning: passing argument 1 of 'strcpy' from incompatible pointer type
strcpy(ptr3, tempStr);
// Code should have been
strcpy(*ptr3, tempStr);
一些编码思路:考虑以下方法,利用代码支付价格一次找到字符串长度,不需要再次这样做。
// As ptr1,ptr2 not changed, use const, it's less restrictive calling
// and potential for additional optimizations.
void join(const char *ptr1, const char *ptr2, char **ptr3) {
size_t len1 = strlen(l1);
size_t size2 = strlen(l2) + 1;
*ptr3 = malloc(len1 + size2);
// Check for allocation success
if (*ptr3)) {
memcpy(*ptr3, ptr1, len1);
memcpy(*ptr3 + len1, ptr2, size2);
printf("%s\n", *ptr3);
}
}
答案 4 :(得分:0)
这里有两个直接的问题:
您没有在结果字符串的末尾为空终止符分配空格:
*ptr3 = (char*)malloc(strlen(tempStr));
应该是
*ptr3 = (char*)malloc(strlen(tempStr) + 1);
你把错误的东西传给了strcpy。
strcpy(ptr3, tempStr);
应该是
strcpy(*ptr3, tempStr);
我怀疑第二个是直接导致崩溃的原因,因为它可能会导致字符串指针(str3
中的main
)被字符串的开头覆盖,并且还会覆盖其他随机堆栈内存。