抱歉,我知道这是非常基本的,但我不知道如何以正确的方式搜索它,所以我们走了。 我正在尝试调用MessageBoxA,我希望该消息用其他东西替换'%s'。例如:
MessageBoxA(0, TEXT("You have %s items"), "title", 0);
任何人都可以帮助我吗?再一次,我知道这是非常基本的,对不起。
答案 0 :(得分:8)
你必须自己构建字符串。在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);
答案 1 :(得分:0)
对于MessageBoxA,它是:
char szBuf[120];
snprintf(szBuf,120, "You have %s items",nItemCount);
MessageBoxA(0, szBuf, "title", 0);
这很难看,但它符合你的需要。
答案 2 :(得分:0)
您可以编写一个实用程序函数来构建std::string
格式的printf
:
#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),并且对字符串的大小没有任意限制。
答案 3 :(得分:0)
在您的示例中:MessageBoxA(0, (boost::format("You have %1 items") % "title").c_str(), 0);
一个优点是您不再需要记住所有这些%s
代码,另一个优点是您不再受内置标志集的限制。
需要( ).c_str()
,因为MessageBoxA
是C接口,而不是C ++,c_str()
将C ++字符串转换为C字符串。