【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

C++を始めたばかりの初心者です
VBからstringの引数をもらって
C++のdllで処理をしてstringを返すものを考えています

dll内で処理をするのにstd::stringに変換したいのですが
変換ほうほうがわかりません

charをstd::stringへ
std::stringをcharへの変換方法を教えてください

宜しくお願いします。

A 回答 (4件)

ん?dll 内の関数が引数型として、std::string 型のものを持っていて、char * の内容の std::string 型をその関数の引数として渡したいということですか??



C++ 内では、 '\0' で終わっている char * を渡せば、std::string への型変換が自動的に働くからそのまま渡せばいいのでは?あるいは、std::string の変数を char * で初期化して渡してもいいですけど。

#include <string>
#include <iostream>
#include <cstring>

void func(const std::string &s) { std::cout << s << '\n'; }
void funcp(const char *p) { std::cout << p << '\n'; }

int main() {
char *cstr = "hoge";
func(cstr); // char * をそのまま渡す
std::string s(cstr);
func(s); // char * で std::string を初期化して渡す
std::string t;
t = cstr; // char * を std::string に代入して渡す
func(t);
funcp(s.c_str()); // s の "hoge" を渡す
char *q = std::strcpy(new char[s.size() + 1], s.c_str()); // 領域を確保して "hoge" を得る
funcp(q);
delete[] q;
}

=====
> ./a.exe
hoge
hoge
hoge
hoge
hoge
    • good
    • 0
この回答へのお礼

ありがとうございます
変換することが出来ました。

お礼日時:2007/09/11 10:07

知りたいことがまったく別のことで、回答が的外れかもしれませんが、一応、「関数が引数型として、std::string 型のものを持っていて、…」のところをきちんと言っておくと^^;



たとえば、

void func1(const std::string &s) { ... }
void func2(std::string s) { ... }
void func3(std::string &s) { ... }

で、func1() と func2() の引数型なら、'\0' でおわっている char * をそのままわたせます。func3 は std::string 型を渡さないといけないので、char * で std::string 型の変数を初期化してから渡します。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
No.2の回答で解決しました。

関数がLPSTRの引数で
内部でstd::stringで処理をし
戻り値としてLPSTRを返したかったのです

お礼日時:2007/09/11 10:11

char * ではなく、char なら、



char c = 'a';
std::string s(&c, 1);
std::string t; // char で初期化できないが、代入はできる
t = c;

if (!s.empty()) c = s[0]; // s の最初の文字を得る

とかしておけばいいですけど。質問は、「dll で処理して云々」とあるから、こういうことじゃないんだろうなぁ。よくわかりませんでした、すみません^^
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
No.2の回答で解決しました。

お礼日時:2007/09/11 10:09

ご利用の VB と C++ 間で、「正式な言語間のインターフェイスが定義されていて、VB の string と C++ の std::string の変換方法もあるはずだが、探しても見つけられなかった」という前提でのご質問ならいいですが^^;



そうではなくて、言語間のインターフェイスが規定されていないなら、std::string などの表現は実装依存ですから、シンプルな型の char * で渡すのがいいのではないですか?(シンプルな型の char * でも、C・C++ ⇔ Fortran で関数を呼び合う場合、文字列長の引数などの指定方法が処理系依存だったような。。。 大域変数で渡すほうが移植性があるのかも^^)。

他に代替方法があるなら、正式サポートのない複数言語の混合使用は、できれば、やめたほうがいいのではないでしょうか?^^;

この回答への補足

今回はdll内部での話しで
C++内でcharからstd::stringへの変換ほうほうということです

わかりにくくてすみません

補足日時:2007/09/11 06:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報