C ++ Concatenate字符串导致“类型'const char *'和'const char”的无效操作数

时间:2013-04-03 21:37:20

标签: c++ char concat

我想连接两个字符串,但是我得到错误,我不明白如何克服这个错误。

有没有办法将此const char *转换为char?我应该使用一些解除引用吗?

../src/main.cpp:38: error: invalid operands of types ‘const char*’ and ‘const char [2]’ to binary ‘operator+’
make: *** [src/main.o] Error 1

但是,如果我尝试以这种方式组成“底部”字符串,它可以工作:

bottom += "| ";
bottom += tmp[j];
bottom += " ";

这是代码。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iterator>
#include <sstream>

int main(int argc, char* argv[]) {

    ifstream file("file.txt");

    vector<string> mapa;
    string line, top, bottom;

    while(getline(file,line)){
        mapa.push_back(line);
    }

    string tmp;
    for(int i = 0; i < mapa.size(); i++)
    {
        tmp = mapa[i];
        for(int j = 0; j < tmp.size(); j++)
        {
            if(tmp[j] != ' ')
            {
                top += "+---";
                bottom += "| " + tmp[j] + " ";
            } else {

            }
        }
        cout << top << endl;
        cout << bottom << endl;
    }

    return 0;
}

7 个答案:

答案 0 :(得分:7)

下面:

bottom += "| " + tmp[j] " ";

您正在尝试将char和指向char的指针相加。这不会起作用(它不会导致字符和指向字符串文字的串联)。如果您在+之后添加tmp[j]符号,情况也是如此,因为仍会将其评估为(添加了额外的括号以强调operator +与左侧关联的事实):< / p>

bottom += ("| " + tmp[j]) + " "; // ERROR!
//         ^^^^^^^^^^^^^
//         This is still summing a character and a pointer,
//         and the result will be added to another pointer,
//         which is illegal.

如果你想把所有东西都放在一行,那就去做:

bottom += std::string("| ") + tmp[j] + " ";

现在,作业右侧的上述表达式将被评估为:

(std::string("| ") + tmp[j]) + " ";

由于operator +std::string的{​​{1}}已定义并返回char,因此在括号中评估子表达式的结果将为{{1然后将其汇总到字符串文字std::string,然后再次返回std::string

最终,整个表达式" "的结果在std::string的输入中给出。

答案 1 :(得分:3)

看起来你的问题就在这一行:

bottom += "| " + tmp[j] " ";

您错过+tmp[j]之间的" "。尝试将其更改为:

bottom += "| " + tmp[j] + " ";

修改

上面的代码仍然会导致编译错误,而你所说的那个错误是g / g ++,以下内容将起作用并产生最少的临时对象:

bottom += std::string("| ") + tmp[j] + " ";

答案 2 :(得分:0)

看起来你错过了tmp [j]和“”之间的一个+。行应该读

bottom += "| " + tmp[j] + " ";

答案 3 :(得分:0)

问题是

tmp[j] + " "

这是不可能的operator+没有为char定义。

但是为字符串定义了operator+。所以你被允许做

bottom += "| "

答案 4 :(得分:0)

请记住,编译将评估equals语句的整个右侧,然后使用上的string::operator+=

因此,编译器尝试评估"| " + tmp[j] + " "。它看到的是一个c-string,一个char和另一个c-string。编译器无法以任何的方式添加这些对您正在尝试做的事情有意义的方式。

相反,你必须逐个连接,以便编译器知道在string中查找运算符,它被重载以连接字符串,或者你可以将c字符串转换为c ++字符串所以编译器知道使用c ++字符串:

bottom += string("| ") + tmp[j] + string(" ");

在这个特定的例子中,你可以放弃string() " " IIRC周围,但这不是最好的方法。

在任何情况下,一次添加一个段是最明确地告诉编译器你想要什么的方式,并且 应该的方式

答案 5 :(得分:0)

            bottom += "| " + tmp[j] " ";

这一行是你的问题,但不只是缺少'+'。

您正在添加"| "tmp[j],第一个是“const char [3]”,第二个是“char”。这些不会添加任何有用的东西,但编译器会将您的char转换为int,将const char [3]转换为const char *并将它们一起添加。然后你尝试在这个const char *中添加一个“const char [2]”,然后它知道它不理解它 - 在指针中添加一个数组?这是您的错误消息报告的内容 - 它发现了这个“const char *”和一个“const char [2]”,它无法弄清楚如何一起添加。

逻辑上,您正在尝试创建一个读取“|?”的字符串,其中?被替换为你的tmp [j]字符。你不能在字符串文字连接中这样做,因为你现在在这里做。一种可能的方法是使用sprintf将其放入字符串中并将其添加到底部。第二种解决方案是分别添加它们。第三个解决方案是首先将tmp [j]转换为std :: string并添加 - 因为向std :: string添加“+”是一个有效的已定义操作。

简而言之,您已经被C ++遗留下来的一些C遗留物所困扰,而C ++无法在不破坏C兼容性的情况下修复。

使用sprintf的示例解决方案:

char buffer[5];
sprintf(buffer, "| %c ", tmp[j]);
bottom += buffer;

答案 6 :(得分:0)

因为你想添加一个指针和一个char,这样的操作是非法的。 如果你不想把它放在一行,你可以这样试试:

string bottom =“”; bottom = bottom +“|”+ tmp [j] +“”;

这样可以正常工作。