const char* 连接

问题描述 投票:0回答:14

我需要连接两个 const 字符,如下所示:

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

我该怎么做?

我从具有 C 接口的第三方库传递了这些

char*
,因此我不能简单地使用
std::string
来代替。

c++ c string-concatenation
14个回答
133
投票

在您的示例中,onetwo是char指针,指向char常量。您无法更改这些指针指向的 char 常量。所以类似的事情:

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

不起作用。相反,您应该有一个单独的变量(字符数组)来保存结果。像这样的东西:

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.

97
投票

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);

34
投票

如果您使用 C++,为什么不使用

std::string
而不是 C 风格字符串呢?

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

std::string three= one+two;

如果您需要将此字符串传递给 C 函数,只需传递

three.c_str()


27
投票

使用

std::string

#include <string>

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

22
投票
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);
出于性能原因,改为
string total( string(one) + two );
(避免构造字符串二和临时字符串总数)

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

10
投票

再举一个例子:

// 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
可能更安全。


5
投票

您似乎正在将 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;

5
投票

首先,你必须创建一些动态内存空间。 然后你可以将两个字符串 strcat 进去。 或者您可以使用 C++“字符串”类。 老派的 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;

5
投票

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

#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;
}

3
投票

您可以使用

strstream
。它已被正式弃用,但我认为,如果您需要使用 C 字符串,它仍然是一个很棒的工具。

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

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

这会将

one
two
写入流中,并使用
\0
附加终止
std::ends
。万一两个字符串最终都可以精确地写入
99
个字符 - 因此不会留下空间来写入
\0
- 我们在最后一个位置手动写入一个。


3
投票
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);

0
投票

动态分配内存时不使用strcpy命令连接两个常量char指针:

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;

0
投票

有一个 C 风格的技巧可以在构建时实现 (const/constexpr) 字符串文字连接。这应该不重要,因为无论如何

const char*
实际上都是 C 风格的东西。并且没有动态分配、strlen 以及这里发布的所有丑陋的东西。一切都由编译器完成,执行过程中什么也不做。

技巧是使用预处理器

#define
指令。

#define PREFIX "/dev/"
#define DEVICE PREFIX "pts/3"

constexpr const char* defaultDevice = DEVICE;

这应该将

/dev/pts/3
分配给变量(2 个预处理器宏之间没有任何空格)。


0
投票
std::string concat(const char* left, const char* right)
{
    const auto left_len = strlen(left);
    const auto right_len = strlen(right);

    std::string result;
    result.reserve(left_len + right_len);
    result.append(left, left_len);
    result.append(right, right_len);
    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.