我们必须输入一个字符串,例如: 1·; = | S | < = 10 ^ 6(字符串的长度) 并执行一些操作,让我们离开操作,我只想知道如何输入像10 ^ 6这样的长字符串? 我们可以像这样的字符S [1000001]; 或者哪种方式更好? 请帮助
答案 0 :(得分:4)
忘记使用c风格的字符串并使用std::string
代替。 std::string
可以容纳std::string::max_size
个字符。在今天的大多数实现中,应该是4294967294个字符。
使用std::string
的好处是它会自动增长以适应您需要的大小。由于内存是动态分配的,因此您不必担心堆栈空间不足。您可能会在堆上耗尽内存,因为您需要大约4 GB的RAM来保存最大字符串。
答案 1 :(得分:2)
我们可以像这样的字符S [1000001];
你可以...但是如果S
是一个自动变量,你将把大部分的堆栈空间花在那个数组上,你可能会耗尽(取决于可用的堆栈空间和多少)你计划的其余部分需要)。
应该动态分配像这样的大型数组。不幸的是,要说如何动态分配大数组/对象并不容易。这取决于一些事情,如:
我使用几千字节作为经验法则来决定我是否需要动态内存。或者在递归函数中的几十个字节,预计会深入。
或哪种方式更好?
std::string
动态分配它的缓冲区,提供操作字符串的方法,确保你不会忘记零终结符并负责管理(如果你手动进行动态分配,这将是一个问题) 。我强烈建议你使用它。
答案 2 :(得分:1)
取决于字符串字符是否为unicode
你可以使用:
char *txt = new char[1000000]
wchar_t *txt = new wchar_t[1000000];
你也可以尝试使用std :: string或者std :: wstring,就像NathanOliver说的那样
答案 3 :(得分:0)
使用std::string
。
或者,如果您的数据没有调整大小,您可以选择使用简单的char数组。由于char数组的大小,我建议您使用new
进行分配,并将其与delete
一起使用。否则,您可能会耗尽堆栈大小并导致堆栈溢出。