调用函数时如何使用更多参数?

时间:2013-09-18 17:58:26

标签: c++

抱歉,我知道这是非常基本的,但我不知道如何以正确的方式搜索它,所以我们走了。 我正在尝试调用MessageBoxA,我希望该消息用其他东西替换'%s'。例如:

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

任何人都可以帮助我吗?再一次,我知道这是非常基本的,对不起。

4 个答案:

答案 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)

使用boost::format

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

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

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