如何在C++中连接两个字符串?

Sla*_*shr 88 c++

我有一个私有类变量char name[10],我想添加.txt扩展名,以便我可以打开目录中的文件.

我该怎么做?

最好创建一个包含连接字符串的新字符串变量.

Naw*_*waz 145

首先,不要使用char*char[N].使用std::string,然后其他一切变得如此简单!

例子,

std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
Run Code Online (Sandbox Code Playgroud)

容易,不是吗?

现在,如果您char const *出于某种原因需要,例如当您想要传递给某个函数时,那么您可以这样做:

some_c_api(s.c_str(), s.size()); 
Run Code Online (Sandbox Code Playgroud)

假设此函数声明为:

some_c_api(char const *input, size_t length);
Run Code Online (Sandbox Code Playgroud)

std::string从这里开始探索自己:

希望有所帮助.

  • 这个字符串连接的时间复杂度是多少? (3认同)

nog*_*ard 30

既然是C++,为什么不用std::string而不是char*?连接将是微不足道的:

std::string str = "abc";
str += "another";
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,就运行时性能而言,这种简单的使用带来了不小的代价。最坏的情况是,“operator+=”同时执行释放和分配。堆分配是我们通常执行的最昂贵的操作之一。 (2认同)

Ton*_*nyK 12

如果您使用C编程,那么假设您name确实是一个固定长度的数组,那么您必须执行以下操作:

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
Run Code Online (Sandbox Code Playgroud)

你现在看到为什么每个人都推荐std::string

  • 难道你不能看到我说"如果你是编程......"? (19认同)
  • 我认为这是相关的,因为"那个人"使用的是char而不是std :: string.此外,它显示了一种明确的连接方式,这种方式在最多投票的答案中没有显示出来.至少我从中学到了一些东西. (7认同)

dte*_*ech 7

从移植的C库中有一个strcat()函数,它将为您执行"C样式字符串"连接.

顺便说一句,尽管C++有很多函数来处理C风格的字符串,但是你可以试着想出你自己的函数来做这件事,例如:

char * con(const char * first, const char * second) {
    int l1 = 0, l2 = 0;
    const char * f = first, * l = second;

    // step 1 - find lengths (you can also use strlen)
    while (*f++) ++l1;
    while (*l++) ++l2;

    char *result = new char[l1 + l2];

    // then concatenate
    for (int i = 0; i < l1; i++) result[i] = first[i];
    for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];

    // finally, "cap" result with terminating null char
    result[l1+l2] = '\0';
    return result;
}
Run Code Online (Sandbox Code Playgroud)

...然后...

char s1[] = "file_name";
char *c = con(s1, ".txt");
Run Code Online (Sandbox Code Playgroud)

......其结果是file_name.txt.

您也可能想要编写自己的operator +IIRC运算符重载但只有指针作为参数是不允许的.

另外,不要忘记这种情况下的结果是动态分配的,所以你可能想要调用delete来避免内存泄漏,或者你可以修改函数来使用堆栈分配的字符数组,当然它提供了足够的长度.

  • 还有`strncat()`函数通常是更好的选择 (3认同)