从字符初始化一个std::string

10

似乎没有标准的构造函数,所以我已经开始采用以下方式

void myMethod(char delimiter = ',')
{
    string delimiterString = 'x';
    delimiterString[0] = delimiter;
    // use string version ...
}

有更好的方法吗?

2个回答

28

std::string有一个构造函数可以为你完成这个任务:

std::string delimiterString(1, delimiter);

数字 1 是一个 size_t 类型并表示 char 参数的重复次数。


1
没有必要更改签名来使用const - &delimiter是一个char *,可以自动转换为const char *。只有在需要删除const属性时才需要使用const_cast。 - bdonlan
1
"&delimiter" 不起作用,因为生成的 "char *" 不会以空字符结尾。 - sth
3
然而,迭代器构造函数可以被使用——std::string s(&delimiter, &delimiter + 1)。 - bdonlan
哇,今晚我完全失败了。为自己辩护,我更喜欢引用与指针或取地址运算符有关的任何内容,但那是我一个真正的新手错误。然而,迭代器构造函数示例被滑稽地重写了。 - Meredith L. Patterson

0

我知道这个问题很古老,但它确实出现在谷歌的首位,而且我花了一段时间才意识到答案。此外,其他答案中提到的填充构造函数并不适用于此。我想到了一个方法,既然 std::string 也就是 std::basic_string<char> 接受字符串字面值,这些字面值是 char *,就像 char [] 一样,那么它也可以接受一个 char,就像 char [] 一样。

char [] 的标准初始化方式为 char(s); 其中 ch 是类型为 char 的变量或常量:

char        chPtr[] = {ch, '\0'}; // Will continue out of bounds without terminator
std::string str     = {ch};       // Wont continue out of bounds (1)
// Also: std::string str{ch};     // operator= is optional

注意1:string不使用\0作为字符串终止符,而是将其视为另一个字符。
另外请注意,将其转换为char *是行不通的:
std::string str     = (char*)ch;  // Breaks All Output

为了方便您的测试:https://onlinegdb.com/sEl5BoBGx

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