1

抱歉,我知道这真的很基础,但我不知道如何正确搜索它,所以我们开始吧。我正在尝试调用 MessageBoxA,并且我希望该消息将“%s”替换为其他内容。例子:

MessageBoxA(0, TEXT("You have %s items"), "title", 0);

谁能帮我?再一次,我知道这真的很基础,对不起。

4

4 回答 4

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);
于 2013-09-18T18:02:51.663 回答
0

对于 MessageBoxA 它是:

char szBuf[120];
snprintf(szBuf,120, "You have %s items",nItemCount);
MessageBoxA(0, szBuf, "title", 0);

它很丑陋,但它会满足你的需要。

于 2013-09-18T18:03:02.447 回答
0

您可以编写一个实用函数来std::stringprintf-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),并且对字符串的大小没有任意限制。

于 2013-09-18T18:07:53.227 回答
0

使用boost::format.

在您的示例中:MessageBoxA(0, (boost::format("You have %1 items") % "title").c_str(), 0);

一个优点是您不再需要记住所有这些%s代码,另一个是您不再受内置标志集的限制。

之所以( ).c_str()需要,是因为MessageBoxA它是 C 接口,而不是 C++,c_str()它将 C++ 字符串转换为 C 字符串。

于 2013-09-18T20:31:40.197 回答