作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些整数,比如说一个
two
和three
。我想创建一个字符串,例如
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/
我是一名优秀的程序员,十分优秀!