函数在C ++中连接两个char *

时间:2011-12-13 18:24:47

标签: c++ visual-studio-2008 dll strcat

首先,我是一名C#程序员,所以我对C ++的工作知识相当有限。我在大学时把它拿回来了,但是10年后还没有碰到它,所以如果这是相对简单的话,请原谅我。

我正在尝试创建一个可以在C#中使用的DLL,它实现了libwpd库。

我设法创建了一个DLL,它可以导出我可以通过P / Invoke访问的2个函数。第一个返回一个常量整数(由visual studio作为样本生成),第二个返回一个字符串。

如果我从函数返回一个常量字符串,它会成功传递给C#,我可以在另一端读取它,所以我知道数据正在被传回。

我遇到的问题是libwpd。我不得不修改他们的TextDocumentGenerator.cpp文件,将信息添加到char *而不是使用他们使用的printf,以便我以后可以访问它。

我已经在头文件的public部分添加了一个变量定义,所以我可以从调用代码中读取它。

现在,我正在尝试编写一个函数,允许我将libwpd给出的char *添加到外部char *。

我想出了这个:

char* addString(const char* addThis, char* toThis)
{
char* copier  = (char*)malloc(strlen(toThis) + 1 + 1);
strcpy(copier, toThis);
strcpy(copier, "1");

toThis = (char*)malloc(strlen(copier) + 1);
strcpy(toThis, copier);

return copier;
} 

但是当我传回信息时,我得到一个空白字符串。

我通过调用totalFile = addString("\n", totalFile);

来调用该函数

(我知道它应该只在技术上反复地在字符串中添加“1”,但它甚至没有做到这一点)

如果我将strcpy更改为复印机行的strcat,它会锁定。

我不知道如何用C ++创建程序,所以我甚至可以逐步完成这些功能,看看发生了什么。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:6)

您是否知道std::string的存在?它是一个用C ++处理字符串的类; char *是C的遗产。

std::string提供+运算符,可以执行您想要的操作。

答案 1 :(得分:2)

您需要为返回字符串分配足够的空间,将初始字符串复制到目标缓冲区,然后调用strcat附加额外信息。

例如:

char* addString(const char* addThis, const char* toThis)
{
    char* destination = (char*)malloc( strlen( addThis ) + strlen( toThis ) + 1 );
    strcpy( destination, toThis );
    strcat( destination, addThis );
    return destination;
} 

不要忘记在调用此函数后,您需要在某个时刻调用free( destination )

编辑: 当然,这只是我修复你问题中提出的功能。实际上,从函数返回指针并指望调用者释放它并不是一个好主意。由于您使用的是C ++而不是C,因此使用某些C ++结构(例如std :: string)或者至少将char *包装在shared_ptr或类似内容中可能要好得多。

如果您打算写C ++,我建议您自己购买a good book这个主题,如果您不知道自己是什么,拍摄自己很容易做。

答案 2 :(得分:1)

由于您要替换printf()来电,sprintf()可能是创建字符串的最简单方法。

答案 3 :(得分:0)

首先,Griwes是正确的。你没有做你正在做的事情并将这个问题标记为C ++。原因很简单,这不是我们在C ++中使用字符串的方式。

由于您是C#程序员,因此您非常了解String课程。好吧,std::string是类似的。它需要处理掉弦乐的工作,这样你就不必沿着痛苦的路线走下去。

要在C ++中将两个字符串连接在一起,它就像:

一样简单
std::string a = "I slept with ";
std::string b = "a heavy heart.";
std::string c = a + b;

瞧。