我需要串联两个这样的const字符:
const char *one = "Hello ";
const char *two = "World";
我该怎么做呢?
我char*
从具有C接口的第三方库传递了这些,所以我不能简单地使用它们std::string
。
strcpy
并strcat
调用的答案,我认为更改标记是有意义的。
我需要串联两个这样的const字符:
const char *one = "Hello ";
const char *two = "World";
我该怎么做呢?
我char*
从具有C接口的第三方库传递了这些,所以我不能简单地使用它们std::string
。
strcpy
并strcat
调用的答案,我认为更改标记是有意义的。
Answers:
在您的示例中,一个和两个是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.
strcpy(one,two);
应该是strcat(one,two);
(不,这使得它正确的,因为你正确地指出)。
sprintf(dest,"%s%s",one,two)
,忘记副本?
如果使用的是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);
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?
再举一个例子:
// 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
可能会更安全。
new
。如果他可以使用它,则应该使用std::string
,如您所说。
似乎您正在将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;
首先,您必须创建一些动态内存空间。然后,您可以将两个字符串插入其中。或者,您可以使用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;
如果您不知道字符串的大小,则可以执行以下操作:
#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;
}
您可以使用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
-我们将在最后一个位置手动写一个。
streambuf
定向输出写入与一起使用的char缓冲区ostream
也不太困难。
在动态分配内存时不使用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;