char数组字符串混乱

时间:2015-03-01 18:24:10

标签: c++ string char type-conversion

我遇到了麻烦,我无法自己解决这个问题。

// string::operator+= vs +
#include <iostream>
#include <string>
using namespace std;


int main ()
{
    unsigned char array[6]= { 'f','o','o','b','a','r' };
    string name ("works and not");
    cout << name<< endl;
    name ="";
    for(int i=0; i < 6;  i++)
        name += array[i];
    cout << "working: "<< name << endl;
    name ="";
    name = array[1] + array[0] + array[0] + array[3] + array[4] + array[5]; 
    cout <<"not working: "<<  name << endl;
    return 0;
}

现在我明白了+=符号中有一些隐藏的转换,我知道,加号符号会添加我的字符​​的整数, 并且只是转换最终值(到&#39; p&#39;)。

但我需要将各种字符组合成一个字符串..如果可能的话,在一行中... 因为我需要不止一次(600 ++次),并且它已经搞乱了代码。

因为这是第一次,而且最有可能是我最后一次需要转换我的&#34;数组&#34;值为字符串,我不是不改变我的字符串btw。

谢谢你!

1 个答案:

答案 0 :(得分:2)

name = array[1] + array[0] + array[0] + array[3] + array[4] + array[5]; 

要求在一行中执行此操作是您的问题。在考虑=之前评估name的右侧。是的,既然这些都是unsigned char s,那么你所得到的只是unsigned char

如果<{em> array属于char,则会有一条捷径:

name = std::string() + array[1] + array[0] + array[0] + array[3] + array[4] + array[5];

现在,RHS正在从应用于(临时)operator+的一系列std::string构建,最终的连接结果被复制分配到name。这很难看,但是......

但是你不能在unsigned char上使用它,因为operator+std::string没有unsigned char。你基本上把自己设计成一个角落,所以,如果你不能使用循环或者首先使用std::string开头,你就是SOL。

如果您不介意进行一些重构,那么这是2015年的解决方案:

#include <iostream>
#include <string>

int main()
{
    unsigned char array[6] = { 'f','o','o','b','a','r' };
    std::string name;

    for (auto i : {1,0,0,3,4,5})
        name += array[i];

    std::cout << name << '\n';
}

live demo