0

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

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它来保存它,但我不知道该怎么做。

4

3 回答 3

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

于 2013-10-24T18:06:42.653 回答
1

你的假设是对的,strcpy 可能会复制到中间的空字符,根据thisstrcpy(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 移动了整个长度,包括字节 [5],而 strcpy 没有,在空终止处停止

于 2013-10-24T18:05:43.047 回答
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);
于 2013-10-24T18:17:54.763 回答