我正在尝试构建一个由两个变量组成的字符串,这些变量由空终止符分隔。对于我们正在使用的自定义协议,必须以这种方式完成。
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
来保存它,但我无法弄清楚如何。
答案 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);