用C / C ++连接字符串

时间:2011-03-18 15:25:17

标签: c++ android c string

如何使用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

6 个答案:

答案 0 :(得分:17)

不是 这样的语言如C / C ++。有C,有C ++。

  • 在C ++中,您使用std::string
  • 连接operator+
  • 在C中,您使用strcat

我知道这并不能完全回答你的问题,这只是一个强烈抗议:)

答案 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的
  • 的sprintf

这里是例子:

在这里输入代码

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。

希望它有所帮助。