我有一个记分板,可以随时获得更新信息,缓冲区大小=我的记分板可以处理的行数,但我试图使其无限制地无限.
我想要做的是as-sign无穷大值到这样的缓冲区:
const int infinity = std::numeric_limits<const int>::infinity();
char Buffer_format_text [infinity];
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为它说:
错误C2057:预期的常量表达式错误C2466:无法分配常量大小为0的数组
有没有办法做到这一点?还是骗术?, 请帮我.不要问我为什么要这样做,我问怎么做.
更新:
这是我用sprintf做的,你怎么在ostringstream?
char Buff[100];
int length = 0;
int amount_of_space = 8;
length += sprintf(Buff+length,"%-*s %s\n", amount_of_space, "Test", "Hello");
Run Code Online (Sandbox Code Playgroud)
this output: Test Hello
Run Code Online (Sandbox Code Playgroud)
在C++ 11,infinity()是constexpr,所以从理论上讲,你可以直接使用这种方式:
char Buffer_format_text[std::numeric_limits<const int>::infinity()];
Run Code Online (Sandbox Code Playgroud)
但是,这里的问题是int 不能代表无限.如果你试过这个:
std::cout << std::numeric_limits<const int>::has_infinity;
Run Code Online (Sandbox Code Playgroud)
您会看到0(false)打印到标准输出(实例).在infinity()为专业化的功能std::numeric_limits,其中has_infinity是false将返回0 -事实上,该功能在这些情况下,毫无意义的-你不能创建大小为0的数组.
此外,你不能指望分配一个无限大小的数组 - 它如何适合内存?如果您事先不知道向量的大小,那么正确的方法是使用std::vector或根据请求分配内存的类似容器.
更新:
看起来你实际上需要一个无限数组就是能够建立一个大小未提前知道的字符串.要封装这样一个动态增长的字符串,您可以使用std::string.
为了执行类型安全输出std::string和替换sprintf(),您可以使用std::ostringstream.这将允许您将内容插入字符串,就像将其打印到标准输出一样.
然后,一旦你完成了工作std::ostringstream,你可以std::string通过调用str()成员函数从中获取一个对象.
这是您在一个简单示例中使用它的方法:
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
int main()
{
std::ostringstream oss;
oss << "The answer is: ";
oss << 42;
oss << ", and this is a double: ";
oss << 3.14;
oss << ". " << std::endl;
oss << "Oh, btw, you can also output booleans: ";
oss << std::boolalpha << true;
oss << ". See? It's easy!" << std::endl;
std::cout << oss.str();
}
Run Code Online (Sandbox Code Playgroud)
现场演示.