连接两个中间带空值的字符串

时间:2013-10-24 18:02:40

标签: c string concatenation

我正在尝试构建一个由两个变量组成的字符串,这些变量由空终止符分隔。对于我们正在使用的自定义协议,必须以这种方式完成。

const char* vendorChar = "3333-3333-4444-aaa3-3333";
const char* userChar = "someUsername";

char usernameString[strlen(vendorChar) + strlen(userChar) + 1];
char* uPtr = usernameString;

strcpy(uPtr, vendorChar);
strcpy(uPtr+strlen(vendorChar)+1, userChar);

当我运行上面的代码时,它只发送vendorChar的值并忽略userChar。当它工作时它应该看起来像

4444-2222-3333-1111\0someUsername

到目前为止,我已经了解到str函数将在字符串末尾看到它时删除null。我想我必须使用memcpy来保存它,但我无法弄清楚如何。

3 个答案:

答案 0 :(得分:1)

你的假设是正确的,strcpy可以复制到中间的空字符, 根据{{​​3}},strcpy(char *str1, const char *str2)执行此操作:

  
    

将str2指向的字符串复制到str1。将复制到并包含str2的空字符。如果str1和str2重叠,则行为未定义。

  

memcpy应该解决问题,因为它只是将内存视为一大块字节,而不是字符串。

strcpy签名:

char *strcpy(char *dest, const char *src);

memcpy签名:

void *memcpy(void *dest, const void *src, size_t n);

所以只需替换名称并添加累积长度(当然也包括空字符)。

修改

为了消除这里提出的一些疑问,请考虑以下代码:

#include "string.h"
#include "stdio.h"
int main() {

    char x[10] = {0};
    char y[10];
    char z[10];
    x[0] = x[1] = x[5] = 'a';
    memcpy(y,x,10);
    strcpy(z,x);
    printf ("y[5]= %s\n", &y[5]);
    printf ("z[5]= %s\n", &z[5]);
    return 0;
}

结果是:

y[5]= a
z[5]=

很明显,memcpy移动了整个长度,包括byte [5],而strcpy没有移动,停止在null终止

答案 1 :(得分:1)

const char* vendorChar = [vendorId cStringUsingEncoding: [NSString defaultCStringEncoding]];
const char* userChar = [dsUsername cStringUsingEncoding: [NSString defaultCStringEncoding]];

char usernameString[strlen(vendorChar) + strlen(userChar) + 2];
char* uPtr = usernameString;

strcpy(uPtr, vendorChar);
memcpy(uPtr+strlen(vendorChar)+1, userChar, strlen(userChar) + 1);

更改:我为尾随\0添加了空格,复制了userChar字符串,其中包含尾随\0

答案 2 :(得分:0)

首先,你需要usernameString []就像 -

char usernameString[strlen(vendorChar) + strlen(userChar) + 3];

因为1表示放置“\”,1表示“0”,另1表示空终止符,因此变为3.然后使用strcat()创建所需的字符串。比如,下面:

strcpy(uPtr, vendorChar);
strcat(uPtr,"\\");
strcat(uPtr,"0");
strcat(uPtr, userChar);