我正在使用旧的 C++ 编译器,它的 STL 中没有 std::to_string(...)
。我想将一个整数字符串化,所以我想我被 char* itoa (int value, char* str, int base)
困住了。我想避免创建一个命名的 char[]
用作 itoa()
的第二个参数。这能做到吗?
我知道我可以做
itoa(5, "abcd", 10)
但这实际上是不正确的,因为“abcd”实际上是一个 const char[]
,我怀疑由此产生的行为充其量是未定义的。当然,放弃常量是 Not Acceptable 。
有什么方法可以将参数列表中的匿名 非常量 char[] 传递给函数吗?我在各种尝试中使用了语法,但无法想出任何东西。我在网上四处查看,包括 StackOverflow,但没有遇到任何完全涵盖此内容的问答。
感谢指导。
更新:
我在原帖中忘记提到:我还需要将 char[] 放在堆栈上,即 new
ing/malloc
ing char[] 不是' 此练习的一个选项。
更新 2:
我收到了一些上下文请求,所以这里是:
重申一下:我坚持使用不支持 std::to_string(...)
我本来想做的:
std::string foo(std::string(itoa(42, < *** non-const stack-allocated char[] *** > , 10)))
即我真正想做的是构造一个带有整数字符串化的 std::string
。
为什么?好的,更多上下文:
我正在尝试创建一个命名信号量,并将其命名为附加 pid。所以这个调用理论上看起来像这样:
sem_open(std::string(typeinfo(*this).name()).append(std::string(itoa(getpid(), < *** non-const stack-allocated char[] *** >, 10))))
我为什么要这样做?
Looks to me like this might be the case of missing the forest for the trees
也许吧。这在一定程度上是一项学术练习,我只是想知道它是否在 C++ 语法范围内可以做到这一点。但除此之外,通过避免堆分配还有一个代码卫生元素:我肯定会忘记在我的析构函数中delete[]
char
。此外,我假设的 char[]
的生命周期实际上只需要用于创建信号量。从句法上保证它只在需要的时候存在不是很好吗?这毕竟是RAII,所以最终这个问题是RAII是否可以针对这种特定情况实现。
再次感谢您的回答和评论。
更新 3
谢谢大家的回答。我认识并理解给出的答案,但我希望找到一个也能避免包装函数的答案。我的疏忽导致我没有在原始问题中提及这一点。这个问题一开始可能措辞不当;我应该首先揭示上下文是为了创建一个信号量,它也可能以不同方式引导评论者。我试图简洁准确地表达我的问题,但我试图简化问题陈述,但最终留下了相关的上下文;对不起..
不过,我自己得出了一个不敬虔的答案。我可能已经正式潜入IOCCC领土,虽然:
sem_open(std::string(typeinfo(*this).name()).append(static_cast<std::ostringstream&>(std::ostringstream() << getpid()).str().c_str()))
最佳答案
在我看来,这可能是只见树木不见森林的情况。
据我了解您的问题,您正在尝试实现 std::to_string
的替代品,因为你的编译器没有它。
并且您想为一个简单的用例实现它 int
转换。
只需让包装函数调整 std::vector<char>
的大小即可足够了,将它用于 char *
用于转换的缓冲区,然后构造一个 std::string
从缓冲区中,您的替换函数返回。
并且,对于纯 C++ 解决方案:
std::string int_to_string(int n)
{
std::ostringstream o;
o << n;
return o.str();
}
关于c++ - 可以创建匿名非常量字符数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563898/