是否可以创建匿名非常量字符数组? 我在一个旧的C++编译器中工作,在STL中没有 STD::toYScript(…)。我想字符串化一个整数,所以我想我只能使用char*itoa(int-value,char*str,int-base)。我希望避免创建命名的char[]作为itoa()的第二个参数。这能做到吗

是否可以创建匿名非常量字符数组? 我在一个旧的C++编译器中工作,在STL中没有 STD::toYScript(…)。我想字符串化一个整数,所以我想我只能使用char*itoa(int-value,char*str,int-base)。我希望避免创建命名的char[]作为itoa()的第二个参数。这能做到吗,c++,arrays,char,constants,C++,Arrays,Char,Constants,我知道我能做到 itoa(5, "abcd", 10) 但这实际上是不正确的,因为“abcd”实际上是一个常量char[],我怀疑结果行为充其量是未定义的。当然,抛弃这种恒定性是不可接受的 有没有办法将参数列表中的匿名非常量字符[]传递给函数?我在各种尝试中尝试了语法,但什么都想不出来。我在网上四处查看,包括StackOverflow,并没有遇到任何与此相关的问答 谢谢你的指导 更新: 我在原来的帖子中忽略了提到:我还需要char[]在堆栈上,即newing/mallocing char[]不

我知道我能做到

itoa(5, "abcd", 10)
但这实际上是不正确的,因为“abcd”实际上是一个
常量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)))
我为什么要这样做


在我看来,这可能是以假乱真

也许吧。这部分是一个学术性的练习,我只是想知道它是否在C++语法中才能做到这一点。但除此之外,还有一个避免堆分配的代码卫生元素:我肯定会忘记在析构函数中
delete[]
char。此外,我假设的
char[]
的生命周期实际上只需要用于创建信号量。从语法上保证它只存在它需要的时间,不是很好吗?毕竟这就是RAII,所以最终的问题是RAII是否可以针对这种特定情况实施

再次感谢您的回答和评论

更新3

谢谢大家的回答。我认识并理解给出的答案,但我希望找到一个同样避免使用包装器函数的答案。我在原来的问题中没有提及这一点,是我的疏忽。这个问题一开始可能措词不当;我应该从揭示上下文开始,即创建一个信号量,该信号量可能也会以不同的方式引导评论者。我试图简洁准确地表达我的问题,但我试图简化问题陈述,结果却离开了相关背景;很抱歉

不过,我刚刚想出了一个不虔诚的回答。我可能已经正式进入了这个领域,不过:

sem_open(std::string(typeinfo(*this).name()).append(static_cast<std::ostringstream&>(std::ostringstream() << getpid()).str().c_str()))

sem_open(std::string(typeinfo(*this).name()).append(static_cast(std::ostringstream())您可以动态分配字符串

char *result = itoa(5, new char[5], 10);
但您必须记住使用:

delete[] result;

您可以动态分配字符串

char *result = itoa(5, new char[5], 10);
但您必须记住使用:

delete[] result;

在我看来,这可能是以假乱真

我理解您的问题,您正在尝试实现对
std::to_string
的替换,因为您的编译器没有它

您希望将其实现为一个简单的
int
转换用例

只需让包装函数充分调整
std::vector
的大小,将其用于
char*
缓冲区进行转换,然后从缓冲区构造一个
std::string
,替换函数返回

<>和,对于纯C++解决方案:

std::string int_to_string(int n)
{
    std::ostringstream o;

    o << n;

    return o.str();
}
std::string int_to_string(int n)
{
std::ostringstream o;

o在我看来,这可能是以假乱真

我理解您的问题,您正在尝试实现对
std::to_string
的替换,因为您的编译器没有它

您希望将其实现为一个简单的
int
转换用例

只需让包装函数充分调整
std::vector
的大小,将其用于
char*
缓冲区进行转换,然后从缓冲区构造一个
std::string
,替换函数返回

<>和,对于纯C++解决方案:

std::string int_to_string(int n)
{
    std::ostringstream o;

    o << n;

    return o.str();
}
std::string int_to_string(int n)
{
std::ostringstream o;

o您不能获取匿名临时地址并使其保持活动状态,除非可能使用一些涉及命名引用的黑客攻击,但这些攻击不适用于数组

因此,您基本上需要对命名数组使用。但是,您可以将其包装在返回
std::string
的函数调用中

std::string my_to_string(int val, int base)
{
    /* Big enough buffer for base=2. */
    char buf[sizeof(int) * CHAR_BIT + 1];
    (void)itoa(val, buf, base);
    return buf;
}

您无法获取匿名临时地址并使其保持活动状态,除非可能使用一些涉及命名引用的黑客攻击,但这些攻击不适用于数组

因此,您基本上需要对命名数组使用。但是,您可以将其包装在返回
std::string
的函数调用中

std::string my_to_string(int val, int base)
{
    /* Big enough buffer for base=2. */
    char buf[sizeof(int) * CHAR_BIT + 1];
    (void)itoa(val, buf, base);
    return buf;
}

因为您需要避免动态分配,所以不能使用
std::string
,除非您可以确保所有相关编译器都使用了短缓冲区优化,并且所有相关编译器的固定缓冲区都足够大,可以满足所有可能的使用情况。但是,您不能使用
std::string

然后,创建基于堆栈的缓冲区就很容易了。
std::numeric\u limits
告诉您小数位数的最大值。但是,由于您使用的是较旧的编译器,它可能不支持
constepr
。因此,只需使用
中静态已知的值来计算它。添加1作为符号,就可以得到最大值m cha的数量