0

C++/cli プログラムでフォーマットされたデータを tcp ip ポートに送信する必要があります。このコードは成功しません。

String^ data;
sprintf(data,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay,
                rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec, 
                rDateTime.udiUSec / 1000,container[i].first,container[i].second);

エラー *error C2664: 'sprintf' : cannot convert parameter 1 from 'System::String ^' to char ** が表示されます

文字列変数std::stringに書き込みたい。

誰かがいくつかの提案を提供できますか.少なくとも私はそれをSystem::String^に変換します. このC++/CLI Converting from System::String^ to std::stringを使用して、それを std:string に変換できます。しかし、C++/cli で異なるデータ型を string^ に書き込む方法がわかりません。

4

4 に答える 4

3

type で一時変数を宣言する必要がありますchar*。ここでは、デモンストレーション目的で固定配列を使用しています。長い文字列がある可能性があるため、バッファ オーバーフロー エラーを回避するために_snprintfを確認することをお勧めします。

で文字列を取得したらchar*、マネージドSystem::Stringを使用して作成できますgcnew

char str[1024];

sprintf(str,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay, 
            rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec,  
            rDateTime.udiUSec / 1000,container[i].first,container[i].second); 

System::String^ data = gcnew System::String(str); 
Console::WriteLine(data);
于 2012-07-04T06:31:16.500 に答える
1

sprintf()関数は、char *最初の引数としてchar配列( )を取ります。このように使用する場合は、最初にchar配列に書き込み、次に文字列に変換する必要があります。についてはわかりませんが、次のように割り当てるSystem::String^だけで、char配列をに変換できます。std::string

char * data = new char[50];
sprintf(data, "Your text goes here");
std::string str = data;

char配列にメモリを割り当てることを忘れないでください!あなたがそれを忘れて、このような何かを書くならば:

char * data;
sprintf(data, "Your text goes here");

エラーが発生します。一方、std :: stringが適切な場合は、フォーマットマニピュレータを使用して直接フォーマットできます。

于 2012-07-04T06:23:24.927 に答える
1

printf新しいマネージ コードを作成している場合、これは正しい方法ではないことは理解していますが、とで動作するアンマネージ レガシ C++ コードを移植している場合、const char*Just To Be Right をすべて書き直す理由はありません。

これは私にとってはうまくいき、どのサイズの文字列でも安全に機能するはずです。これを使用して、Trace(...) を呼び出すいくつかの関数をラップし、委任されたアクションでログ メッセージを処理する柔軟性を提供します。

void TraceBase1(const char* prefix, const char* format, va_list argp) {
  if (Logger::m_logDelegate != nullptr) {

    System::String^ message;

    int count = _vscprintf(format,argp) + 1;
    char* buffer = new char[count ];
    try {
        _vsnprintf(buffer,count,format,argp);
        message =  gcnew System::String(buffer);
        Logger::m_logDelegate(message);
    }
    finally {
        delete[] buffer;
    }
  }
}
于 2013-05-08T20:24:19.333 に答える
0

プラットフォームでsprintfがどのように機能するかを見たことがありますか?

于 2012-07-04T03:46:09.907 に答える