2

変数で MessageBox 関数を使用するのに問題があります

私は持っている

int main(int argc, char* argv[])
{
   char* filename = argv[0];
   DWORD length = strlen(filename);

   MessageBox(0, TEXT("filename text"), TEXT("length text"), 0); // Works
}

しかし、変数のファイル名と長さを次のように出力したい:

MessageBox(0, filename, length, 0); -- compiler error

関数 MessageBox の構文は次のとおりです。

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

使ってみた

MessageBox(0, (LPCWSTR)filename, (LPCWSTR)length, 0);

しかし、出力はある種の象形文字です。

4

2 に答える 2

0

変数lengthは文字列ではなく、文字列のみを使用できます。それを a にキャストしようとするとchar*、の値がlength文字列へのポインターとして取得され、未定義の動作が発生するため、役に立ちません。

C++ の場合、egstd::to_stringを使用して、文字列以外の値を文字列に変換できます。

MessageBox(0, filename, std::to_string(length).c_str(), 0);

c_strを取得するには関数を使用する必要があることに注意してくださいchar*

持っていない場合は、代わりにstd::to_string例を使用できます。std::istringstream

std::istringstream is;
is << length;
MessageBox(0, filename, is.str().c_str(), 0);

より古いスタイルの C ソリューションが必要な場合は、snprintf(または_snprintfVisual Studio で):

char length_string[20];
_snprintf(length_string, sizeof(length_string), "%ld", length);
MessageBox(0, filename, length_string, 0);
于 2013-09-05T10:04:16.763 に答える