C++中如何使用char + *char?

C++中如何使用char + *char?,c++,pointers,merge,char,C++,Pointers,Merge,Char,这是我最近遇到的一个问题 如果我要做这样的东西: string str1 = "some"; string str2 = "thing"; cout << str1 + str2 << endl; 我需要得到以下输出 那么,我该怎么做呢?是的,我确实需要char*。在这种情况下,您需要使用strcat。 正如注释中指出的,您需要类似char[]的内容作为新字符串的缓冲区。您需要创建大小为strlenchr1+strlenchr2+1+1、last+1的缓冲区,因为str

这是我最近遇到的一个问题

如果我要做这样的东西:

string str1 = "some";
string str2 = "thing";
cout << str1 + str2 << endl;
我需要得到以下输出

那么,我该怎么做呢?是的,我确实需要char*。

在这种情况下,您需要使用strcat。
正如注释中指出的,您需要类似char[]的内容作为新字符串的缓冲区。

您需要创建大小为strlenchr1+strlenchr2+1+1、last+1的缓冲区,因为strlen返回的字符串长度没有空终止符,但c字符串应该以null终止符结尾,然后使用strncpy将第一个字符串复制到新缓冲区中,然后使用strncat

尽管strcat可能是scarletamannanth已经提到的最佳解决方案,但还有另一个解决方案

还可以首先将c字符串转换为std::string,对其执行任何所需的操作,然后将结果转换回c字符串。在某些情况下,这可能更适合您的需要

例如:

优点:

可以写为一行,无需进一步删除缓冲区等。 可能允许通过std::string方法和相关函数进行更轻松的操作 缺点:

额外开销 只能获取常量字符*,如果需要字符*,则必须再次复制c字符串
假设返回的const char*直接指向std::string对象的内部缓冲区。因此,只要std::string对象没有超出范围,指针就仍然有效。因此,将其与如下常量char*result=std::stringstr1+str2.c_str这样的临时变量一起使用;这是一个非常糟糕的主意,但是在函数调用中写入类似的内容是合法的,因为临时性会一直保留到调用返回为止。

有几个注意事项:

首先,因为试图修改字符串文字是未定义的行为。 第二,指针上的运算符+涉及指针算术,char*在这方面并不特殊。如果需要连接字符串,则需要分配一个缓冲区,在其中逐个复制两个字符串。

现有的答案除了使用PARANAIX之外,还使用了普通的C函数,但是如果C++生成的STRIGHORT使用STD::CUT:< /P>,它将更为地道。


首先,字符串连接不是必需的;您可以继续使用流插入操作符,通常答案是use std::string

是的,我真的需要char,没错


不仅仅是打印,我还需要获取char*变量作为结果容器,以便将来使用

。。。但在这种情况下:

#include <cstring>

std::size_t len1 = std::strlen(str1);
std::size_t len2 = std::strlen(str2);
// unique_ptr: automated lifetime management
// 1 for '\0' terminator
std::unique_ptr<char[]> buffer( new char[len1 + len2 + 1] );
std::copy_n(str1, len1, buffer.get());
std::copy_n(str2, len2, buffer.get() + len1);
buffer.get()[len1 + len2] = '\0'; // after this, buffer.get()
                                  // points to your string

因为这是C++,所以必须有人建议我要建议什么。使用stringstream


callocint size,sizeof[type]调用计算了保留最终字符*所需的所有内存。这样,你可以把两个字符放在一起,以更多的C++方式。但是,你想做的更像是C,但是既然你在C++中,那么尽可能多地使用C++中的方法。

但是要小心,在这个问题中,任何字符串指针都不能作为StrcA.Dead的目标,应用程序在StrCAString中崩溃。@ USER(9090591),那是因为你做的不对。这就是建议使用std::string的原因。更简单。@user2890591有一个答案包含了整个机器的准确和正确使用,请看:。由于OP是新手,所以您最好分配+1个字符?如果需要删除,而是使用Booo::UnQuyJTPR在C++或STD::UnQuyJPPTR和STD::MaxIOx:C++中的SCAPPTF是对CPY/CAT/CAT部分的一个很好的替代。即sprintfbuffer,%s%s,chr1,chr2;如果你想的话,它可以很方便地处理一些小问题,比如在它们之间切换。如果你所做的只是打印它们,那么你可以做的不仅仅是打印,我需要将char*变量作为结果容器,我需要进一步使用它。您是否考虑过使用std::string并在需要const char*时使用它的c_str方法?因此,如果您试图在函数中执行此操作,并且尝试执行return combined.c_str;返回的常量字符*将超出范围@user2890591我注意到您说您的应用程序在尝试@Paranaix的解决方案时崩溃了。我建议你每次返回一个STD::string并调用CySTR,每次需要使用一个con*ch*。首先,你应该声明STR1和STR2为conchchar:@ ScLeLaMARTANTH,遵守好的做法永远不会太迟,字符串文字在C和C++中都是const,省略const是一个错误,而在C++11中,它甚至是非法的。Stackoverflow是唯一一个因以下原因而取消trolling的门户:。如果我尝试这样做:*iNeedResultHere=result;我显然会得到一个类型的成本char *值,它不能被分配给char *的实体,我知道关于C++的CaskSCAST,但是它没有帮助。
e char*x=abc;x[0]=“d”;因此,你永远不应该这样做。代码中的任何字符串文字都必须视为不可变的。如果你想要修改的字符数组,你必须分配一个缓冲区来复制它们,无论是用C型样式、新的char……删除[] C++、String C++等等,还是初始化为char x[] = ABC,因为它从字符串文本中初始化一个4字符的数组。确保指针只在std::字符串保持有效时才保持有效。获取的指针直接指向std::string对象的缓冲区。如果与临时工一起工作,这一点尤其重要。我想我会在我的回答中包括这一点。如果你对c_srt返回的字符串执行const_cast,然后修改char*,然后再次使用c_str,会发生什么?lucas92你不能这样做,这就是为什么string类返回const char*@lucas92,而仅仅从标准来看,这只是未定义的行为,因为如果你改变一个常量铸造的对象,情况就是这样。从技术上讲,我认为只要你不改变绳子的大小,一切都会很好。所以用char*替换单个char应该是可行的。顺便说一句,c_str可能两次都返回相同的地址。我这样做,它写起来很容易也很快,如果一个const str是可以接受的话,它工作得很好。如果const不好,那么你别无选择,只能继续使用其他技术soo。。。基本上不只是使用std::string作为容器并调用c_str获取const char*,而是建议他使用std::unique_ptr作为容器并调用get获取const char*?OP指出他需要char*。由于他没有具体说明为什么std::string不合适,我们不得不相信他的话。这是一个基于字符*的解决方案,添加了RAII安全性。OP可以直接使用char*,但它需要一个额外的行delete[]调用,没有增加任何好处,并且使代码更糟糕/更不安全。我和下一个家伙一样喜欢std::unique_ptr,但我很难理解为什么与@Paranaix相比,这是一个好的解决方案。如果您要介绍一个容器,为什么不使用正确的容器,对吗?我知道-通常我会简单地建议std::string,就像我实际做的那样:。也就是说,如果我要在not std::string中使用char*,我不会将std::string::c_str的结果存储到一个单独的变量中,并向下传递堆栈。否则,当变量(而不是指针所在的变量)超出范围时,内存缓冲区将失效。当第二个开发人员决定指针也应该用于其他用途时,这可能是一个不明显的错误。简而言之,代码不是自文档化的。
char* buffer = new char[strlen(chr1) + strlen(chr2) + 1 + 1];
strcpy(buffer, chr1);
strcat(buffer, " ");
strcat(buffer, chr2);
// use buffer
delete[] buffer;
const char* str1 = "foo";
const char* str2 = "bar";

std::string combined = std::string(str1) + str2; // notice std::string + char* => std::string

const char* result = combined.c_str();
#include <string>
#include <stringstream>
std::ostringstream ss; ss << chr1 << " " << chr2;
const std::string s = ss.str();
const char *result = s.c_str(); // you can use this pointer during the scope of `s`.
std::string str1 = "some";
std::string str2 = "thing";
std::cout << str1 << str2 << std::endl;
const char* chr1 = "How do "
const char* chr2 = "I do this?"
std::cout << chr1 << chr2 << std::endl;

// Output: How do I do this?
#include <cstring>

std::size_t len1 = std::strlen(str1);
std::size_t len2 = std::strlen(str2);
// unique_ptr: automated lifetime management
// 1 for '\0' terminator
std::unique_ptr<char[]> buffer( new char[len1 + len2 + 1] );
std::copy_n(str1, len1, buffer.get());
std::copy_n(str2, len2, buffer.get() + len1);
buffer.get()[len1 + len2] = '\0'; // after this, buffer.get()
                                  // points to your string
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main() {
    char *chr1 = "How do";
    char *chr2 = "I do this?";
    stringstream ss;

    ss << chr1 << chr2;
    string result = ss.str();
    char* final = (char*) calloc(result.size()+1, sizeof(char));
    strcpy(final, result.c_str());

    cout << final << endl;

    delete [] chr1, chr2, final;

    return 0;
}