【问题标题】:Collecting many printf calls in a single string在单个字符串中收集许多 printf 调用
【发布时间】:2022-11-28 16:48:09
【问题描述】:

我正在处理一些执行 RC4 加密算法的代码,其中一些参数传递给函数。从那里我试图将生成的哈希附加到一个空字符串,但我的几次尝试都失败了。我见过 snprintf() 的用法,但我如何才能转换下面的代码以将打印的内容保存到字符串中呢?

    for (size_t i = 0, len = strlen(plaintext); i < len; i++) {
        printf("|x%02hhx| ", hash[i]);
    }

【问题讨论】:

  • snprintf() 有什么问题?唯一的区别是您指定了缓冲区和大小。
  • 我猜我在附加要保存的字符串时遇到了问题。我在循环 std::string stored_text = "" 外声明了我的空字符串,在我的循环内我尝试附加字符串 stored_text += snprintf(buffer, size, "%02hhx", hashtext[index]);
  • @aaries 尝试从缓冲区构造一个字符串并连接,类似于 stored_text += std::string(buffer) 在调用 snprintf 之后。
  • @aaries snprintf return 是什么?鉴于此,将整数附加到字符串上是否有意义?数据在缓冲区中,所以你不应该追加那个缓冲区吗?
  • @Rulle 非常感谢!这正是我要找的!

标签: c++


【解决方案1】:
【解决方案2】:

在确定 std::snprintf 的输出大小后,只需使用 std::string::data 即可:

template<class...Args>
std::string PrintFToString(char const* format, Args...args)
{
    std::string result;
    char c;
    int requiredSize = std::snprintf(&c, 1, format, args...);
    if (requiredSize < 0)
    {
        throw std::runtime_error("error with snprintf");
    }

    result.resize(requiredSize);

    int writtenSize = std::snprintf(result.data(), requiredSize+1, format, args...);
    assert(writtenSize == requiredSize);

    return result;
}

template<class...Args>
void AppendPrintFToString(std::string& target, char const* format, Args...args)
{
    char c;
    int requiredSize = std::snprintf(&c, 1, format, args...);
    if (requiredSize < 0)
    {
        throw std::runtime_error("error with snprintf");
    }

    auto const oldSize = target.size();
    target.resize(oldSize + requiredSize);

    int writtenSize = std::snprintf(target.data() + oldSize, requiredSize+1, format, args...);
    assert(writtenSize == requiredSize);
}

int main() {
    std::cout << PrintFToString("|x%02hhx| ", 33) << '
';

    std::string output;
    for (int i = 0; i != 64; ++i)
    {
        AppendPrintFToString(output, "|x%02hhx| ", i);
        output.push_back('
');
    }

    std::cout << output;
}

注意:如果您知道输出字符数的合理上限,则可以使用在堆栈上分配的 char 数组进行输出,而不必使用 2 次调用 std::snprintf...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多