如何连接例如如何连接两个字符串与许多空字符?
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
,有许多空字符两个字符串。我试过strcat()
。它不工作。有什么办法吗?
如何连接例如如何连接两个字符串与许多空字符?
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
,有许多空字符两个字符串。我试过strcat()
。它不工作。有什么办法吗?
这很棘手,因为根据定义,C字符串是空终止的。所以你真正想要的是两个字节的缓冲区,而不是两个字符串。 (这就是为什么像strcat
这样的函数在这里不能工作的原因 - 他们希望他们的参数是C字符串。)
由于您不能使用空字符来告诉您缓冲区在哪里结束你可以用C字符串,你需要事先知道缓冲区的大小。然后,它为位块传输两成一个缓冲简单:
char dest[16];
memcpy(dest, s, 5); // Copy s to the final buffer
memcpy(dest + 5, m, 11); // Copy m to the final buffer just after s
所有C标准库字符串函数将在第一个\0
上停止。这是设计。事实上,你的输入数组而不是可以很好地处理这些函数,因为它们不会以\0
结尾。
所以最简单的方法是使用memcpy
来代替,并指定要复制的字符数。不要忘记在目标缓冲区中分配必要的内存量。
如果它们不停在第一个NUL字节,它们不是字符串函数。这不是设计问题,而是C中字符串的约定/定义。 – Olaf
更直接的方式:
const int size_s = 5;
const int size_m = 11;
char s[size_s]={'s','a','\0','c','h'};
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char destination[size_s+size_m];
int i;
for (i = 0;i < size_s;i++)
destination[i] = s[i];
for (i = 0;i < size_m;i++)
destination[i+size_s] = m[i];
理想情况下,你应该使用memcpy
const int size_s = 5;
const int size_m = 11;
char s[size_s]={'s','a','\0','c','h'};
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char destination[size_s+size_m];
memcpy(destination,s,size_s);
memcpy(destination,m,size_m);
目的地+ size_s为第二个副本? – Bathsheba
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char* e = (char*)malloc(sizeof(s) + sizeof(m));
memcpy(e, s, sizeof(s));
memcpy(&e[sizeof(s)], m, sizeof(m));
当你完成后,不要忘记删除结果字符串。
free(e);
技术上,null结束了一个字符串。使用指针运算和'memcpy()' –
以空字符结尾的字符串只包含一个空字符,这显然是字符串中的最后一个字符。 –
你的数组末尾缺少一个''0':eg:'{'s','a','\ 0','c','h'};' - >'{' S', 'A', '\ 0', 'C', 'H', '\ 0'};'。没有这一点,你不能确定最后一个字符串的结束位置。其实你甚至需要两个''\'0',所以你知道有更多的字符串。 –