2

まず、私は C# プログラマーなので、C++ に関する実用的な知識はかなり限られています。大学時代に持って帰りましたが、10年以上触っていないので比較的簡単なものでしたらご容赦ください。

libwpd ライブラリを実装する C# で使用できる DLL を作成しようとしています。

P/Invoke 経由でアクセスできる 2 つの関数をエクスポートする DLL を作成できました。1 つ目は定数整数 (サンプルとして Visual Studio によって生成されたもの) を返し、2 つ目は文字列を返します。

関数から定数文字列を返すと、それは C# に正常に渡され、反対側で読み取ることができるので、データが返されていることがわかります。

私が直面している問題は、libwpd にあります。後でアクセスできるように、彼らが使用する printf を使用する代わりに、情報を char* に追加するように TextDocumentGenerator.cpp ファイルを変更する必要がありました。

ヘッダー ファイルの 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

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++を使用しているため、std ::stringなどのC++構造を使用するか、少なくとも、char*をshared_ptrなどでラップする方がはるかに良いでしょう。

C ++を作成する場合は、このテーマに関する優れた本を購入することをお勧めします。自分が何をしているのかわからない場合は、足を撃ち抜くのは非常に簡単です。

于 2011-12-13T18:29:47.280 に答える
1

printf()呼び出しを置き換えているため、sprintf()おそらく文字列を作成する最も簡単な方法です。

于 2011-12-13T18:36:02.503 に答える
0

まず、Griwes は正しいです。あなたがやっていることをやっていて、この質問をC++としてマークするビジネスはありません。単純な理由は、これは C++ で文字列を扱う方法ではないからです。

あなたは C# プログラマーなので、このStringクラスをよく知っています。うーん、std::string似てる。弦を扱う手間が省けるので、下に行くという苦痛な道をたどる必要がありません。

C++ で 2 つの文字列を連結するには、次のように簡単です。

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

出来上がり。

于 2011-12-13T18:36:10.400 に答える