如何使用C / C ++连接字符串?
我尝试了以下方法:
PS:errorInfo是一个char *我应该返回它。
errorInfo = strcat("Workflow: ", strcat(
workflowToString(workflow).utf8(), strcat(" ERROR: ",
errorCode.utf8)));
sprintf(errorInfo, "Workflow %s ERROR: %s",
workflowToString(workflow).utf8(), errorCode.utf8());
errorInfo = "Workflow: " + workflowToString(workflow).utf8() + " ERROR: " + errorCode.utf8;
只是sprintf编译,但在运行我的应用程序崩溃时。
PS:我正在使用Android的NDK
答案 0 :(得分:17)
不是 这样的语言如C / C ++。有C,有C ++。
std::string
operator+
我知道这并不能完全回答你的问题,这只是一个强烈抗议:)
答案 1 :(得分:3)
根据this page strcat
执行以下操作:
将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且新的空字符附加在由目标中的两个串联形成的新字符串的末尾。
但是,在您的实现中,"Workflow: "
是一个常量字符串。您无法修改该字符串,这是strcat
的作用。为此,请创建一个字符串,如:
char message[1000];
strcpy(message, "Workflow: ");
strcat(message, "other string");
....
但是,请注意utf8字符编码,因为一个utf8代码点的长度可能是多char
。
答案 2 :(得分:2)
串联几乎总是错误的字符串构建习惯,特别是在C语言中。它容易出错,使代码混乱,并且具有极差的渐近性能(即O(n^2)
代替O(n)
来构建字符串长度为n
)的字符串。
相反,您应该使用snprintf
函数,如:
snprintf(buf, sizeof buf, "Workflow: %s ERROR: %s", workflow, error);
或者如果您正在写入文件/套接字/等。并且不需要将结果字符串保留在内存中,只需使用fprintf
开始。
答案 3 :(得分:1)
使用strcat()
,您使用的是c,而不是c ++。
c不会自动为您管理内存。
c可能会让人感到困惑,因为有时看起来它有一个字符串数据类型,它所做的就是为字符数组提供一个字符串接口。
首先,strcat()
的第一个参数必须是可写的,并且有足够的空间来添加第二个字符串。
char *out = strcat("This", "nThat");
要求c踩踏字符串文字内存。
一般情况下,您不应该使用strcat()/sprintf
,就像上面“选择”的答案一样。你可以用这种方式覆盖内存。请改用strncat()/snprintf()
以避免缓冲区溢出。如果您不知道strncat()
中要传递给“n”的大小,那么您可能会做错事。
在c中执行此操作的一种方法是:
#define ERROR_BUF_SIZE 2048 // or something big enough, you have to know in c
char errorInfo[ERROR_BUF_SIZE];
snprintf(errorInfo, ERROR_BUF_SIZE, "Workflow %s ERROR: %s",
workflowToString(workflow).utf8(), errorCode.utf8());
或类似地使用strncpy/strncat
答案 4 :(得分:1)
使用字符串文字,您可以简单地使用:
char str[] = "foo" " bar";
const char *s = " 1 " " 2 ";
s = " 3 " " 4 ";
答案 5 :(得分:1)
使用Android NDK时,有很多方法可以在C中连接:
我使用的两种方式是:
这里是例子:
在这里输入代码
strcat的
char* buffer1=(char*)malloc(250000);
char* buffer2=(char*)malloc(250000);
char* buffer3=(char*)malloc(250000);
buffer1 = strcat(buffer1, buffer2);
的sprintf
sprintf(buffer3,"this is buffer1: %s and this is buffer2:%s",buffer1,buffer2);`
sprintf返回字符串的长度
不建议使用strcat,因为它使用更多的内存.. 你可以使用sprintf或其他类似strcpy。
希望它有所帮助。