gpt4 book ai didi

c++ - 如何在 char* 中存储整数和字符的串联?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:19 25 4
gpt4 key购买 nike

我有一些整数,比如说一个 twothree。我想创建一个字符串,例如

char* example = "There are " + one + " bottles of water on " + 
two + " shelves in room number " + three + "\n".`

这在 C/C++ 中不起作用。如何将这种类型的值存储在 char* 中?

最佳答案

在 C 中,有不止一种方法可以做到这一点,具体取决于您希望如何分配内存[*]。对于从堆中分配它的直接选项:

len = snprintf(0, 0, "%d bottles, %d shelves, room %d\n", one, two, three);
char *result = malloc(len+1);
if (result == 0) { /* handle error */ }
snprintf(result, len+1, "%d bottles, %d shelves, room %d\n", one, two, three);

/* some time later */
free(result);

当心 snprintf 的非标准实现,它们在超出缓冲区时不返回长度。检查您的文档。

在 C++ 中,snprintf 不在标准中,即使它可用,上面的代码也需要转换 malloc[**] 的结果。 C++ 添加了使用字符串流的选项:

std::stringsteam r;
r << one << " bottles, " << two << " shelves, room " << three << "\n";
std::string result = r.str();

// if you absolutely need a char*, use result.c_str(), but don't forget that
// the pointer becomes invalid when the string, "result" ceases to exist.

这避免了缓冲区长度的困惑,使资源管理更容易,并避免了 printf 和 friend 可能为格式说明符传递错误类型的参数的风险。它通常是首选。

然而,它在某些情况下不太灵活:格式是硬连接到代码中而不是包含在格式字符串中,因此很难使文本可配置。它也可能更难阅读,例如,在任何此类代码行的第一个版本中省略空格字符的情况并不少见。但是如果你想在 C++ 中使用 snprintf 方法,并且 snprintf 在你的实现中可用,那么你可以利用 C++ 更简单的内存管理,如下所示:

len = std::snprintf(0, 0, "%d bottles, %d shelves, room %d\n", one, two, three);
std::vector<char> r(len+1);
std::snprintf(&r[0], r.size(), "%d bottles, %d shelves, room %d\n", one, two, three);

char *result = &r[0];
// again, "result" is only valid as long as "r" is in scope

[*] 请注意,您不能将字符串“存储”在 char* 中,因为 char* 只是一个指针。您可以将指向字符串的指针存储在 char* 中,但字符串本身是完全独立的东西。

[**] 因为 C 和 C++ 是不同的语言!

关于c++ - 如何在 char* 中存储整数和字符的串联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com