2

首先,我是一名 C# 程序员,所以我对 C++ 的工作知识相当有限。大学的时候拿回来了,10年没碰过,如果是比较简单的东西请见谅。

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

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

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

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

我已将变量定义添加到头文件的公共部分,以便我可以从调用代码中读取它。

现在,我正在尝试编写一个函数,允许我将 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

4 回答 4

6

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

std::string提供+运营商,这就是你想要的。

于 2011-12-13T18:28:40.187 回答
3

您需要为返回字符串分配足够的空间,将初始字符串复制到目标缓冲区,然后调用 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++,我建议您给自己买一本关于该主题的好书,如果您不知道自己在做什么,那真的太容易自取其辱了。

于 2011-12-13T18:29:47.280 回答
1

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

于 2011-12-13T18:36:02.503 回答
0

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

由于您是 C# 程序员,因此您非常了解String该类。嗯,std::string是类似的。它消除了处理琴弦的腿部工作,因此您不必走下痛苦的路线。

在 C++ 中将两个字符串连接在一起,很简单:

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

瞧。

于 2011-12-13T18:36:10.400 回答