从 char(不是 char*)到 std::string 的首选转换

Posted

技术标签:

【中文标题】从 char(不是 char*)到 std::string 的首选转换【英文标题】:Preferred conversion from char (not char*) to std::string 【发布时间】:2011-06-11 08:26:13 【问题描述】:

我有一个char,一个普通的老角色,我想把它变成一个std::stringstd::string(char) 当然不存在。我可以创建一个 char 数组并将其复制进去,我可以通过字符串流,或许多其他小的迂回路线。目前,我更喜欢boost::lexical_cast,但对于这个简单的任务来说,即使这样也显得过于冗长。那么首选的方式是什么?

【问题讨论】:

【参考方案1】:

std::string 有一个构造函数,它接受一个数字和一个字符。字符将重复给定的次数。因此,您应该使用:

std::string str(1, ch);

【讨论】:

这是正确的答案。但是我不喜欢这个构造函数的地方是我没有使用它来记住参数的顺序。如果你让它们切换,它仍然可以编译。 @Fred Larson 这当然是我在尝试这个解决方案时发生的事情。 对于字符数组@Maxim,使用带有指针和字符数的构造函数。在你的情况下,std::string(x, 3). @Rob:但那是另一个构造函数,我指的是填充构造函数的限制。你也可以std::string(&ch, 1) 可怕的参数顺序。为什么不只允许一个 char 而没有 count 参数呢?【参考方案2】:

要添加答案,您可以简单地使用初始化列表

std::string str = ch;

【讨论】:

【参考方案3】:

只使用带字符的重载?

string(1, 'A')

【讨论】:

【参考方案4】:

您仍然可以使用带有两个迭代器的字符串构造函数:

char c = 'x';
std::string(&c, &c + 1);

更新:

James 和 GMan 的问题问得好。刚刚在 Derek M. Jones 的可免费下载的“新 C 标准”中搜索“指针过去”,我的第一个命中是:

如果表达式 P 指向一个 数组对象的元素和 表达式 Q 指向最后 同一数组对象的元素, 指针表达式 Q+1 比较 大于 P... 即使 Q+1 确实 不指向数组的元素 对象...

关于分段架构 将指针递增到末尾 段导致地址换行 分段架构 该段的开头(通常 地址零)。如果一个数组是 在这样一个段内分配, 要么实施必须确保 阵列后有空间 有一个结束 地址,或者它使用其他一些 处理的实现技术 这种情况(例如,如果使用的段 是指针表示的一部分, 结束段之后的特殊段 可能会被赋值)...

C 关系运算符模型支持 指向要处理的对象的指针 与索引到数组中的方式相同 对象。关系比较 在两个不同的索引之间 数组对象(不是两者 较大对象的子对象)很少 有任何意义,标准确实 没有定义对指针的这种支持。 有些应用程序确实需要使用 亲属信息 不同物体的位置 贮存。但是,这种用法并没有 被认为是足够普遍的 委员会指定一个 定义行为的模型...

大多数实现不执行任何检查 在对值进行任何操作之前 具有指针类型。大多数处理器 使用相同的说明 执行关系比较 涉及使用时的指针类型 对于算术类型。对于处理器 使用分段内存 架构中,指针值通常是 使用两个组件表示,a 段号和内的偏移量 那个片段。这样做的后果 代表是有很多 分配存储的好处 对象,使其适合 单段(即,存储一个 对象不跨越段 边界)。一个好处是 涉及生成的优化 一些机器码 关系运算符,它只需要 检查段偏移分量。 这可能导致以下情况 p >= q 为假,但 p > q 为真, 当 p 和 q 指向不同的对象时。

【讨论】:

这严格有效吗?你能把一个标量对象当作一个单元素数组,然后使用一个过去的指针吗? 当然。一个元素和一个标量的数组具有相同的布局和对齐方式。其实 sizeof(element) 被定义为元素对齐的倍数,这样数组的元素之间就没有填充。 @Maxim:我们怎么知道的?超过数组末尾的指针是有效的(尽管不能取消引用),但我不认为像@James 所说的那样,超过元素的指针是有效的。 @Maxim:诉诸常识与“因为我认为如此,我希望如此,而且应该如此”是一样的;事实并非如此。不,这不是“常识”或詹姆斯,我不会问。我真的怀疑这个答案是否定义了行为。 §5.7/4 “就这些运算符而言,指向非数组对象的指针与指向长度为 1 的数组的第一个元素的指针的行为相同”没关系。【参考方案5】:

这适用于 gcc C++ 4.9.2 (http://ideone.com/f3qhTe)

#include <iostream>
using namespace std;

int main() 
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;

【讨论】:

以上是关于从 char(不是 char*)到 std::string 的首选转换的主要内容,如果未能解决你的问题,请参考以下文章

QT Qstring怎么转化成char[],不是char*

错误 C2440:“=”:无法从“const char *”转换为“char *”

Java中的char 不能存所有的汉字

char * 到字符串文字如何有效?

缓冲区溢出,sprintf而不是char调整大小? [重复]

C++:从 char 到 char* 的无效转换?