gpt4 book ai didi

iphone - 需要替换 iPhone 项目中使用的 C 代码中 strcpy_s 的使用

转载 作者:行者123 更新时间:2023-11-30 14:29:17 28 4
gpt4 key购买 nike

我有一个需要在 iPhone 项目中使用的 C SDK,并且示例代码是为与 Visual Studio 一起使用而编写的。它包括 strcpy_s 的使用,这是 Microsoft 独有的字符串函数。

file_header.header_size = FIT_FILE_HDR_SIZE;
strcpy_s((FIT_UINT8 *)&file_header.data_type, sizeof(".FIT"), ".FIT"); << problem!

我尝试像这样更改为 strcpy 和 strncpy

strncpy((FIT_UINT8 *)&file_header.data_type, ".FIT", sizeof(".FIT"));

但我收到此警告:

警告:传递“builtin_strncpy_chk”参数 1 时的指针目标符号不同

警告:传递“__inline_strncpy_chk”参数 1 时的指针目标的符号不同

警告:调用内置_strncpy_chk将始终溢出目标缓冲区

结构体file_header是这样的:

typedef struct
{
FIT_UINT8 header_size; // FIT_FILE_HDR_SIZE (size of this structure)
FIT_UINT8 protocol_version; // FIT_PROTOCOL_VERSION
FIT_UINT16 profile_version; // FIT_PROFILE_VERSION
FIT_UINT32 data_size; // Does not include file header or crc. Little endian format.
FIT_UINT8 data_type[4]; // ".FIT"
} FIT_FILE_HDR;

FIT_UINT8 是 typedef 无符号字符。

所以我们可以看到,typedef 中给定的长度为 4,并且 strcpy_s 通过引用获取 data_type 并将“.FIT”复制到其中。 strncpy 我哪里出了问题?如果你现在还没有猜到我不是一个 C 程序员:)

编辑:这不会给我错误,但它是正确的吗?

strncpy((void *)&file_header.data_type, ".FIT", sizeof(file_header.data_type));

最佳答案

对于任何“安全字符串”操作,大小几乎应始终是目标缓冲区的大小;如果您使用源字符串的大小,您不妨调用memcpy

如果您想要 C99 一致性:

strncpy(file_header.data_type, ".FIT", sizeof file_header.data_type);

但是,strlcpy(一种 BSDism,在 iOS 中可用)受到许多人的青睐,因为它保证目标将以 null 结尾:

strlcpy(file_header.data_type, ".FIT", sizeof file_header.data_type);

但请注意,以 nul 结尾的字符串“.FIT”实际上并不适合分配的空间,因为它需要 5 个字符(尾随 nul 需要 1 个字符)。如果您使用 strlcpy,您将看到生成的字符串只是“.FI”,因为 strlcpy 保证 null 终止,并在必要时截断您的字符串。

如果您需要 nul 终止,您可能需要将 data_type 数组的大小增加到 5。正如 caf 正确指出的那样,这看起来像一个文件header,在这种情况下可能不需要 null 终止;在这种情况下,首选 strncpy;我什至可能使用 memcpy,并避免让 future 的开发人员认为该字段是一个字符串。

关于iphone - 需要替换 iPhone 项目中使用的 C 代码中 strcpy_s 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com