C++ 将两个常量字符*组合在一起

C++ 将两个常量字符*组合在一起,c++,string,char,constants,C++,String,Char,Constants,我已经尝试了很多方法,我得到了一个void,它是静态的,在我制作的控制台类上,void本身工作良好: Console::WriteLine(const char* msg) 另一方面,我得到了另一个const char*non static void,它调用Console::WriteLine void,我已经在C上工作了大约一年,在C上我可以很容易地做这样的事情: string a = "Start "; string b = a + "End"; 当我在C++上调用这个时,它给了我很多错

我已经尝试了很多方法,我得到了一个void,它是静态的,在我制作的控制台类上,void本身工作良好:

Console::WriteLine(const char* msg)
另一方面,我得到了另一个const char*non static void,它调用Console::WriteLine void,我已经在C上工作了大约一年,在C上我可以很容易地做这样的事情:

string a = "Start ";
string b = a + "End";

当我在C++上调用这个时,它给了我很多错误:

Player::Kill(const char* Message)
{
    Console::WriteLine("> " + Message + " <");
}
Player::Kill(const char*消息)
{

控制台:WriteLine(“>”+消息+“< >代码> char */CODE >是指针(所以是<代码>)>“<代码> >代码> >“+ + +”,因为您称之为C++代码,仅此:

void Player::Kill(std::string const& Message)
{
    Console::WriteLine(("> " + Message + " <").c_str());
}
void播放器::Kill(std::字符串常量和消息)
{

Console::WriteLine((“>”+Message+“)与其连接字符串并创建额外的临时对象,为什么不单独输出这3个字符串

Player::Kill(const char* Message)
{
  Console::Write("> ");
  Console::Write(Message);
  Console::WriteLine(" <");
}
Player::Kill(const char*消息)
{
控制台::写入(“>”);
控制台::写入(消息);
Console::WriteLine(“”const”表示“无法更改(*1)”。因此您不能简单地将一个const字符字符串“添加”到另一个(*2)。您可以做的是将它们复制到非const字符缓冲区中

const char* a = ...;
const char* b = ...;

char buffer[256]; // <- danger, only storage for 256 characters.
strncpy(buffer, a, sizeof(buffer));
strncat(buffer, b, sizeof(buffer));

// now buffer has the two strings joined together.
这意味着

b = (std::string)a + (const char*)" End";
除了创建一个额外的字符串之外,它应该是可以的,您可能想要的是

std::string a = "Start";
a += " End";
如果您在执行此操作时遇到编译错误,请将其发布(确保包含)

或者你可以这样做:

std::string addTwoStrings(const std::string& a, const std::string& b)
{
    return a + b; // works because they are both strings.
}
以下所有工作:(见现场演示)

2“const char a+const char*b”实际上是在尝试添加两个指针,而不是两个字符串,结果是字符串a的地址加上字符串b的地址,其总和是一些随机内存位置
#include <iostream>
using namespace std;

string string1 = "John";
string string2 = "Smith";

float string1Len = string1.length();
float combinedLen = string1.length() + string2.length();
char combine[string2.length() + string1.length()];

for(int i = 0; i < string1Len; ++i){
    combine[i] = string1[i];
}
for(int i = string1Len; i < combinedLen; ++i){
    combine[i] = string2[i - string1Len];
}

const char * combined = combine;
使用名称空间std; 字符串string1=“John”; 字符串string2=“Smith”; float string1Len=string1.length(); float combinedLen=string1.length()+string2.length(); 字符组合[string2.length()+string1.length()]; 对于(int i=0;i
使用
std::string
@Rapptz正如你在上面看到的,我已经尝试了std string库,但它给了我错误。它给你什么错误?@WARLOCK,你必须更具体一些。这是正确的方法。如果
WriteLine
使用
const char*
。让它使用
const std::string&
。Welcome到堆栈溢出。为了获得最佳响应,除了显示您所做的研究,如果可能,您还应该尝试发布所得到的编译器错误的全文。请参阅部分。IntelliSense:无运算符“+”匹配这些操作数操作数类型为:const char[3]+const std::stringconst表示无法将结果保存在该变量(const char)或位置(const char*)。他对+的问题是两个指针不能相加(
const char*a、*b、*c;c=a+b;
a和b是指针,并且+在指针之间无效,现在
c=a+10;
工作得很好)。与const本身无关。结果无论如何都会传递给函数。另外,第二个示例工作得很好:
a+“End”
在a是std::string时完全有效。
“End”
是一个常量字符*,它被用作只读输入字符串!还根据您的注释将更改合并到第二个字符串示例中。@WARLOCK为了正确起见,它实际上与“const”无关。只是您不能添加指针(当您编写
“>”+消息时)
左侧操作数
“>“
被转换为
const char*
即指针)。但是操作符
+
特别适用于
(字符串,字符串)
,也适用于组合
(字符串,const char*)
(const char*,字符串)
因此
字符串b=a+“End”
实际上(即使
a
常量)。(@kfsone downvote不是我写的)编辑:哇3条新评论!奇怪-它没有显示编辑,但我可以发誓我从帖子中得到了“const char*”a和b,并尝试使用strcat等。也许我是从一个被删除的答案中得到的。@kfsone这确实是可能的,作为帖子(答案或问题,首字母或编辑)作者可以在提交后5分钟内对其进行修改,而不会在修订历史记录中留下“痕迹”(这就是“快速”评论在提交后“脱离主题”的方式^^)
std::string addTwoStrings(const std::string& a, const std::string& b)
{
    return a + b; // works because they are both strings.
}
#include <iostream>
#include <string>

std::string addTwoStrings(const std::string& a, const std::string& b)
{
    return a + b; // works because they are both strings.
}

void foo(const char* a, const char* b)
{
    std::string str = a;
    std::cout << "1st str = [" << str << "]" << std::endl;
    str += " ";
    std::cout << "2nd str = [" << str << "]" << std::endl;
    str += b;
    std::cout << "3rd str = [" << str << "]" << std::endl;
    str = addTwoStrings(a, " ");
    std::cout << "4th str = [" << str << "]" << std::endl;
    str = addTwoStrings(str, b);
    std::cout << "5th str = [" << str << "]" << std::endl;
}

int main()
{
    foo("hello", "world");
}
const size_t len = strlen("hello");
size_t newLen = len + strlen("world");
// but this would not be legal:
len += 2; // error: len is const.
#include <iostream>
using namespace std;

string string1 = "John";
string string2 = "Smith";

float string1Len = string1.length();
float combinedLen = string1.length() + string2.length();
char combine[string2.length() + string1.length()];

for(int i = 0; i < string1Len; ++i){
    combine[i] = string1[i];
}
for(int i = string1Len; i < combinedLen; ++i){
    combine[i] = string2[i - string1Len];
}

const char * combined = combine;