首先,我是一名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 ++创建程序,所以我甚至可以逐步完成这些功能,看看发生了什么。
任何帮助都将不胜感激。
答案 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;
瞧。