6

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

有没有办法将此 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;
}
4

7 回答 7

7

这里:

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

您正在尝试对 achar和指向 的指针求和char。那是行不通的(它不会导致字符和指向的字符串文字的串联)。如果您在+之后添加一个符号也是如此tmp[j],因为它仍将被评估为(添加额外的括号以强调operator +关联到左侧的事实):

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 +了 for a std::stringand achar并返回 an std::string,因此计算括号内的子表达式的结果将是 an std::string,然后将其与字符串字面量相加" ",(再次)返回 an std::string

最终,整个表达式的结果(std::string("| ") + tmp[j]) + " "在输入中给出operator +=

于 2013-04-03T21:42:33.373 回答
3

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

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

你缺少一个+betweentmp[j]" "。尝试将其更改为:

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

编辑:

以上仍会导致编译错误,而您使用 g++ 声明的错误,以下将起作用并产生最少的临时对象:

bottom += std::string("| ") + tmp[j] + " ";
于 2013-04-03T21:40:31.097 回答
0

因为你要添加一个指针和一个字符,这样的操作是非法的。如果您不想在一行中完成,可以这样尝试:

字符串底部 = ""; 底部=底部+“|”+tmp[j]+“”;

这将正常工作。

于 2013-07-04T14:23:56.190 回答
0

看起来您在 tmp[j] 和“”之间缺少一个 +。行应为

bottom += "| " + tmp[j] + " ";
于 2013-04-03T21:41:25.317 回答
0

问题是

tmp[j] + " "

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

但是operator+是为字符串定义的。所以你可以这样做

bottom += "| "
于 2013-04-03T21:43:38.827 回答
0

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

因此,编译器尝试评估"| " + tmp[j] + " ". 它看到的是一个 c-string、一个 char 和另一个 c-string。编译器无法以任何对您尝试执行的操作有意义的方式添加这些内容。

相反,您必须逐段连接,以便编译器知道查找string运算符,该运算符被重载以连接字符串,或者您可以将 c-strings 转换为 c++ 字符串,以便编译器知道使用 c++ 字符串:

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

在这种特定情况下,您可以放弃string()周围的" "IIRC,但这不是最好的方法。

在任何情况下,一次附加一个段是告诉编译器你想要什么的最明确的方式,也是你应该这样做的方式。

于 2013-04-03T21:44:10.877 回答
0
            bottom += "| " + tmp[j] " ";

这条线是你的问题,但不仅仅是缺少'+'。

您正在添加"| "and 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 兼容性的情况下无法修复这些遗留问题。

sprintf 的示例解决方案:

char buffer[5];
sprintf(buffer, "| %c ", tmp[j]);
bottom += buffer;
于 2013-04-03T21:46:44.220 回答