C++ C++;浓缩字符串会导致“引用”;类型为‘;常量字符*’;和‘;常量字符“;
我想连接两个字符串,但我得到了一个错误,我不知道如何克服这个错误 有没有办法把这个常量字符*转换成字符?我应该使用一些解引用吗C++ C++;浓缩字符串会导致“引用”;类型为‘;常量字符*’;和‘;常量字符“;,c++,char,concat,C++,Char,Concat,我想连接两个字符串,但我得到了一个错误,我不知道如何克服这个错误 有没有办法把这个常量字符*转换成字符?我应该使用一些解引用吗 ../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 += "| "
../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;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
ifstream文件(“file.txt”);
向量mapa;
弦线,顶部,底部;
while(getline(文件,行)){
mapa.推回(直线);
}
串tmp;
对于(int i=0;i 看来您的问题出在这条线上:
bottom += "| " + tmp[j] " ";
您在tmp[j]
和“
之间缺少一个+
。请尝试将其更改为:
bottom += "| " + tmp[j] + " ";
编辑:
上述操作仍将导致编译错误,而您所述的w/g++编译错误,以下操作将起作用,并产生最小的临时对象:
bottom += std::string("| ") + tmp[j] + " ";
看起来tmp[j]和“”之间缺少+号。行应为
bottom += "| " + tmp[j] + " ";
在这里:
您试图将char
和指向char
的指针求和。这将不起作用(不会导致字符和指向的字符串文字的串联)。如果在tmp[j]
之后添加+
符号,情况也是如此,因为这仍然会被计算为(添加额外的括号以强调运算符+
与左侧关联的事实):
如果您想将所有内容都放在一行中,只需执行以下操作:
bottom += std::string("| ") + tmp[j] + " ";
现在,作业右侧的上述表达式将计算为:
(std::string("| ") + tmp[j]) + " ";
由于定义了std::string
和char
的运算符+
,并返回一个std::string
,因此对括号内的子表达式求值的结果将是一个std::string
,然后将其求和为字符串文字”
,再次返回一个std::string
最后,整个表达式(std::string(“|”)+tmp[j])+“
的结果在操作符+=
的输入中给出。问题是
tmp[j] + " "
这是不可能的运算符+
未为字符定义
但是操作符+
是为字符串定义的。所以您可以这样做
bottom += "| "
请记住,编译将计算equals语句的整个右侧,然后在该语句上使用string::operator+=
因此,编译器尝试计算“|”+tmp[j]+”
。它看到的是一个c字符串、一个字符和另一个c字符串。编译器无法以任何方式添加这些内容,而这对您尝试执行的操作都是有意义的
相反,你必须逐段地连接,这样编译器就可以为操作符查找<>代码>字符串< /> >,它被重载以连接字符串,或者你可以将C字符串转换成C++字符串,这样编译器就知道使用C++字符串:
bottom += string("| ") + tmp[j] + string(" ");
在这个特定的实例中,您可以在“
IIRC周围删除string()
,但这不是最好的方法
在任何情况下,每次追加一个段都是告诉编译器您想要什么的最明确的方式,也是您应该采取的方式
bottom += "| " + tmp[j] " ";
这一行是您的问题,但不仅仅是缺少“+”的问题
您正在添加“|”
和tmp[j]
,第一个是“const char[3]”,第二个是“char”。这些不会添加任何有用的内容,但编译器会将您的char转换为int,将const char[3]转换为const char*,并将它们添加在一起。然后尝试添加“const char[2]”对于这个常量字符*,在这一点上它知道它不理解它-向指针添加一个数组?这就是您的错误消息报告的内容-它找到了这个“常量字符*”和一个“常量字符[2]”,它不知道如何将它们加在一起
从逻辑上讲,您正在尝试创建一个字符串,其内容为“|?”,其中?被替换为tmp[j]字符。但是,您不能像现在这样使用字符串文字连接。一种可能的方法是使用sprintf将其放入字符串中,并将其添加到底部。第二种解决方案是分别添加它们。第三种解决方案是首先将tmp[j]转换为std::string,然后将其添加为使用“+”进行添加std::string是一个已定义的有效操作
简而言之,你被C的一些传统所困扰,C++不能修复而不破坏C兼容性。
sprintf的示例解决方案:
char buffer[5];
sprintf(buffer, "| %c ", tmp[j]);
bottom += buffer;
因为您想要添加指针和字符,而这样的操作是非法的。
如果您不想在一行中完成,可以这样尝试:
字符串底部=”;
底部=底部+“|”+tmp[j]+”
这将很好。bottom+=“|”+tmp[j];
到bottom+=“|”+tmp[j]+“
哦,对不起,是我复制的。不,甚至是在我修复它的时候。对不起,是我复制代码时出错的。不是那样的。对不起,是我复制代码时出错的。不是那样的。@chris,你能说得更具体一点吗?@booka,哎呀,我忘了从右到左的作业,所以仍然不起作用。你必须转换第一个或第二个作业不需要额外的括号,因为操作符+
从左到右都可以工作。是的。但是我不认为依靠操作符的关联性来从编译器中得到你想要的东西是可取的,特别是因为很明显OP不明白为什么这很重要…@chris:我补充了这一点只是为了澄清一些事情“你在努力
bottom += "| " + tmp[j] " ";
char buffer[5];
sprintf(buffer, "| %c ", tmp[j]);
bottom += buffer;