如何使用长度初始化std::string?

38

如果一个字符串的长度在编译时已经确定,我该如何正确初始化它呢?

#include <string>
int length = 3;
string word[length]; //invalid syntax, but doing `string word = "   "` will work
word[0] = 'a'; 
word[1] = 'b';
word[2] = 'c';

...这样我就可以像这样做一些事情吗?

示例:http://ideone.com/FlniGm

我这样做的目的是因为我有一个循环,将另一个字符串特定区域的字符复制到一个新字符串中。


你的意思是在编译时吗?如果是在运行时,只需将一些字母放入其中,std::string 就会自动处理剩下的部分。如果你确实是指编译时,则 std::string 不支持此功能。 - Praxeolitic
是的,抱歉我想说的是编译时间。 - penu
6个回答

59

7

您可以这样初始化您的字符串:

string word = "abc"

或者

string word(length,' ');
word[0] = 'a';
word[1] = 'b';
word[2] = 'c';

如果要复制的字符串直到编译时才知道,那么这种方法就行不通。 - penu
@penu 为什么你要这样做 a[0] = 'h'; a[1] = 'i'; 而不是更自然的 a = "hi"; 呢? - greatwolf
@greatwolf 我有一个for循环,可以从另一个字符串的特定区域复制字符。 - penu
@penu 好的,那就执行 a += other_str;。你现在访问 a[i] 的方式是错误的,因为无法保证 std::string 已经分配到了你尝试访问的索引位置。换句话说,assert(i < a.length()); - greatwolf
@penu 对于误解我感到抱歉。如果您想按字符初始化它,就必须分配正确数量的索引。 - zachyee

5

4

std::string 不支持在编译时确定长度的字符串。甚至有一个提案将编译时字符串添加到C++标准中。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4121.pdf

目前你需要有些运气。你可以使用static const char[],它支持编译时常量字符串,但很明显缺乏一些 std::string 的便利性。哪个更适合取决于你正在做什么。可能std::string的特性是不必要的,使用static char[] 是正确的方法;也可能需要std::string,但运行时成本是微不足道的(非常有可能)。

你尝试的语法可以与static const char[]一起使用:

static const char myString[] = "hello";

任何在其他答案中展示的std::string构造函数都是在运行时执行的。

4
您可能正在寻找以下内容:
string word(3, ' ');

0

你也可以通过以下方式简单地初始化新字符串ans:

string ans = sourceString;

这样,你就可以将重新排列后的字符串复制到ans中。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接