我正在努力实现一些低级文件写入,其中文件格式特定于每个位。我需要将 NSString
中的字符串复制到长度为 16 的以空字符结尾的字符串中(根据 Xcode,这是不可分配的)。对于 c
,我是一个完全 n00b 的人,我想确保我理解正确。这就是我目前正在做的事情:
//I have a non-null NSString called _friendly_name.
const char *string = [_friendly_name UTF8String];
//profile.friendly is a utf-8 null-terminated string
memcpy(&profile.friendly_name, &string, 16);
这还没有经过测试,但我想确保它会起作用。这会提供我期望的行为吗?或者我应该以不同的方式复制字符串(例如 strcpy
)?
最佳答案
您可以使用 memcpy()
或 strcpy()
,但是您必须自己检查边界,并且代码中还有其他错误。
所以,我认为您想将 NSString 复制到 char[16]
大批。您可以使用 NSString
内置方法来执行此操作,您不必使用 memcpy()
你自己:
NSString *src;
char dest[16];
NSUinteger destlen;
[src getBytes:dest
maxLength:sizeof(dest) - 1
usedLength:&destlen
encoding:NSUTF8StringEncoding
options:0
range:NSMakeRange(0, [src length])
remainingRange:NULL];
dest[destlen] = '\0';
如果您想使用 memcpy()
,那么你必须这样做:
NSString *src;
char dest[16], *srcUtf8;
size_t len;
srcUtf8 = [src UTF8String];
len = strlen(srcUtf8);
if (len >= sizeof(dest))
len = sizeof(dest) - 1;
memcpy(dest, srcUtf8, len);
dest[len] = '\0';
代码中的错误
这段代码有两个错误!
memcpy(&profile.friendly_name, &string, 16); // Wrong!
首先,&string
是错的。应该是 string
, 因为 string
是指向要复制的字符串数据的指针。如果您复制&string
,您将得到一个指针和一些随机复制的堆栈数据位。换句话说,你会得到垃圾。
其次,16 是错误的。如果知道 string
,则只能复制 16 个字节指向至少 16 个字节的数据。如果 string
,这将导致段错误(使您的程序崩溃,很难)小于 16 字节内存中的以下数据不可读。它今天可能不会崩溃,但可能下周就会崩溃,而你会忘记这一切吗?
错了,除非你知道源至少有 16 个字节长,否则不要传递 16。
关于objective-c - memcpy 会正确复制字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946723/