Const char * 级联

我需要像这样连接两个常量字符:

const char *one = "Hello ";
const char *two = "World";

我该怎么做呢?

我从一个具有 C 接口的第三方库传递了这些 char*,因此我不能简单地使用 std::string代替它们。

292880 次浏览

在您的示例中,是指向字符常量的字符指针。不能更改这些指针指向的字符常数。比如:

strcat(one,two); // append string two to string one.

应该使用一个单独的变量(char 数组)来保存结果:

char result[100];   // array to hold the result.


strcpy(result,one); // copy string one into the result.
strcat(result,two); // append string two to the result.

如果您正在使用 C + + ,为什么不使用 std::string而不是 C 样式的字符串呢?

std::string one="Hello";
std::string two="World";


std::string three= one+two;

如果需要将这个字符串传递给 C 函数,只需传递 three.c_str()

使用 std::string:

#include <string>


std::string result = std::string(one) + std::string(two);

首先,您必须创建一些动态内存空间。然后你可以把两根弦连接起来。或者可以使用 c + + “ string”类。传统的 C 方式:

  char* catString = malloc(strlen(one)+strlen(two)+1);
strcpy(catString, one);
strcat(catString, two);
// use the string then delete it when you're done.
free(catString);

新的 C + + 方式

  std::string three(one);
three += two;

C 方法:

char buf[100];
strcpy(buf, one);
strcat(buf, two);

C + + 方式:

std::string buf(one);
buf.append(two);

编译时的方式:

#define one "hello "
#define two "world"
#define concat(first, second) first second


const char* buf = concat(one, two);

再举一个例子:

// calculate the required buffer size (also accounting for the null terminator):
int bufferSize = strlen(one) + strlen(two) + 1;


// allocate enough memory for the concatenated string:
char* concatString = new char[ bufferSize ];


// copy strings one and two over to the new buffer:
strcpy( concatString, one );
strcat( concatString, two );


...


// delete buffer:
delete[] concatString;

但是,除非你特别不想或者不能使用 C++标准程式库,否则使用 std::string可能更安全。

你可以使用 strstream。它已经被正式废弃了,但是如果你需要使用 C 字符串,我认为它仍然是一个很好的工具。

char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);


s << one << two << std::ends;
result[99] = '\0';

这将把 onetwo写入流中,并使用 std::ends附加一个终止的 \0。如果这两个字符串最终都可以精确地写入 99字符,那么写入 \0时就没有空间了,我们在最后一个位置手动写入一个字符。

看起来您正在使用 C + + 和 C 库,因此您需要使用 const char *

我建议将这些 const char *包装成 std::string:

const char *a = "hello ";
const char *b = "world";
std::string c = a;
std::string d = b;
cout << c + d;
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);
const char *one = "Hello ";
const char *two = "World";


string total( string(one) + two );


// to use the concatenation as const char*, use:
total.c_str()

更新: 更改 string total = string(one) + string(two); 由于性能原因(避免构造字符串2和临时字符串合计) ,将

// string total(move(move(string(one)) + two));  // even faster?

在内存动态分配中不使用 strcpy 命令连接两个常量字符指针:

const char* one = "Hello ";
const char* two = "World!";


char* three = new char[strlen(one) + strlen(two) + 1] {'\0'};


strcat_s(three, strlen(one) + 1, one);
strcat_s(three, strlen(one) + strlen(two) + 1, two);


cout << three << endl;


delete[] three;
three = nullptr;

如果你不知道字符串的大小,你可以这样做:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(){
const char* q1 = "First String";
const char* q2 = " Second String";


char * qq = (char*) malloc((strlen(q1)+ strlen(q2))*sizeof(char));
strcpy(qq,q1);
strcat(qq,q2);


printf("%s\n",qq);


return 0;
}