抱歉,我知道这真的很基础,但我不知道如何正确搜索它,所以我们开始吧。我正在尝试调用 MessageBoxA,并且我希望该消息将“%s”替换为其他内容。例子:
MessageBoxA(0, TEXT("You have %s items"), "title", 0);
谁能帮我?再一次,我知道这真的很基础,对不起。
抱歉,我知道这真的很基础,但我不知道如何正确搜索它,所以我们开始吧。我正在尝试调用 MessageBoxA,并且我希望该消息将“%s”替换为其他内容。例子:
MessageBoxA(0, TEXT("You have %s items"), "title", 0);
谁能帮我?再一次,我知道这真的很基础,对不起。
您必须自己构建字符串。在 C++ 中,这通常使用 来完成std::ostringstream
,例如:
#include <sstream>
...
std::ostringstream message;
message << "You have " << numItems << " items";
MessageBoxA(NULL, message.str().c_str(), "title", MB_OK);
在 C 中,这通常通过以下方式完成snprintf(3)
:
#include <stdio.h>
...
char buffer[256]; // Make sure this is big enough
snprintf(buffer, sizeof(buffer), "You have %d items", numItems);
MessageBoxA(NULL, buffer, "title", MB_OK);
对于 MessageBoxA 它是:
char szBuf[120];
snprintf(szBuf,120, "You have %s items",nItemCount);
MessageBoxA(0, szBuf, "title", 0);
它很丑陋,但它会满足你的需要。
您可以编写一个实用函数来std::string
从printf
-style 格式构建一个:
#include <cstdio>
#include <cstdarg>
#include <string>
#include <vector>
std::string build_string(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
size_t len = vsnprintf(NULL, 0, fmt, args);
va_end(args);
std::vector<char> vec(len + 1);
va_start(args, fmt);
vsnprintf(vec.data(), len + 1, fmt, args);
va_end(args);
return std::string(vec.begin(), vec.end() - 1);
}
使用此函数,您可以创建任意字符串并将指向其内容的指针作为向下参数传递:
MessageBoxA(0, build_string("You have %d items", item_count).c_str(), "title", 0);
它具有简单的优点(几行代码只使用stdio
而不依赖于 iostreams),并且对字符串的大小没有任意限制。
在您的示例中:MessageBoxA(0, (boost::format("You have %1 items") % "title").c_str(), 0);
一个优点是您不再需要记住所有这些%s
代码,另一个是您不再受内置标志集的限制。
之所以( ).c_str()
需要,是因为MessageBoxA
它是 C 接口,而不是 C++,c_str()
它将 C++ 字符串转换为 C 字符串。