const char *连接
我需要连接两个常量字符,如下所示:
const char *one = "Hello "; const char *two = "World";
我该怎么做呢?
我从一个C接口的第三方库传递这些char*
s,所以我不能简单地使用std::string
来代替。
在你的例子中, 一个和两个是char指针,指向char常量。 你不能改变这些指针指向的字符常量。 所以就像
strcat(one,two); // append string two to string one.
不pipe用。 相反,你应该有一个单独的variables(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方式:
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);
如果您使用C ++,为什么不使用std::string
而不是C风格的string?
std::string one="Hello"; std::string two="World"; std::string three= one+two;
如果您需要将此string传递给C函数,只需传递three.c_str()
使用std::string
:
#include <string> std::string result = std::string(one) + std::string(two);
更新:改变的string total = string(one) + string(two);
string total( string(one) + two );
性能方面的原因(避免构buildstring2和临时string总数)
const char *one = "Hello "; const char *two = "World"; string total( string(one) + two ); // OR: string total = string(one) + string(two); // string total(move(move(string(one)) + two)); // even faster? // to use the concatenation in const char* use total.c_str()
再举一个例子:
// 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
可能更安全。
看起来好像你在C库中使用C ++,因此你需要使用const char *
。
我build议把这些const char *
包装成std::string
:
const char *a = "hello "; const char *b = "world"; std::string c = a; std::string d = b; cout << c + d;
首先,你必须创build一些dynamic的内存空间。 然后,你可以把这两个弦放入它。 或者你可以使用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;
你可以使用strstream
。 这是正式的弃用,但它仍然是一个伟大的工具,如果你需要使用Cstring,我想。
char result[100]; // max size 100 std::ostrstream s(result, sizeof result - 1); s << one << two << std::ends; result[99] = '\0';
这将写入one
,然后two
到stream中,并附加一个终止\0
使用std::ends
。 如果两个string都可能最终写入99
字符 – 所以没有空间留下写入\0
– 我们在最后一个位置手动写入一个字符。
const char* one = "one"; const char* two = "two"; char result[40]; sprintf(result, "%s%s", one, two);
如果你不知道string的大小,你可以这样做:
#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; }
在dynamic分配内存时不使用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;