我应该使用哪些字符串操作函数?

lor*_*ova 16 c string

在我的Windows/Visual C环境中,有许多替代方法可以执行相同的基本字符串操作任务.

例如,为了进行字符串复制,我可以使用:

  • strcpy,ANSI C标准库函数(CRT)
  • lstrcpy,kernel32.dll中包含的版本
  • StrCpy,来自Shell Lightweight Utility库
  • StringCchCopy/ StringCbCopy,来自"安全字符串"库
  • strcpy_s,安全增强版CRT

虽然我理解所有这些替代方案都有历史原因,但我可以为新代码选择一组一致的函数吗?哪一个?或者我应该根据具体情况选择最合适的功能?

Wiz*_*ard 13

首先,让我们回顾一下每个功能集的优缺点:

ANSI C标准库函数(CRT)

strcpy如果您正在开发可移植C代码,那么函数是唯一的选择.即使在仅限Windows的项目中,将可移植代码与依赖于操作系统的代码分开也许是明智之举.
这些功能通常具有装配级优化,因此非常快.
有一些缺点:

  • 它们有很多限制,因此通常您还需要调用其他库中的函数或提供自己的版本
  • 有一些像臭名昭着的古董 strncpy

Kernel32字符串函数

类似lstrcpy的函数由kernel32导出,只有在尝试避免对CRT的依赖时才应使用.您可能希望这样做有两个原因:

  • 为超轻量级可执行文件避免CRT有效负载(这些天不寻常,但不是10年前!)
  • 避免初始化问题(如果你用CreateThread而不是启动一个线程_beginthread).

此外,kernel32函数可以比CRT版本更优化:当您的可执行文件将在针对Core i13优化的Windows 9上运行时,kernel32 可以使用程序集优化版本.

Shell轻量级实用功能

以下是对kernel32函数所做的相同考虑,以及一些更复杂函数的附加值.但是我怀疑他们是否积极维护,我会跳过它们.

StrSafe功能

StringCchCopy/ StringCbCopy函数通常是我个人的选择:他们是很好的设计,功能强大,而且快得惊人(我还记得那个白皮书这些功能相比,性能提升到CRT当量).

安全性增强的CRT功能

这些函数具有与ANSI C等价物非常相似的无可置疑的优点,因此移植遗留代码是一件小事.我特别喜欢基于模板的版本(当然,只有在编译为C++时才可用).我真的希望它们最终会标准化.不幸的是,他们有许多缺点:

  • 虽然是一个提议的标准,但它们基本上被非Windows社区拒绝(可能只是因为它们来自微软)
  • 失败时,他们不只是返回错误代码,而是执行无效的参数处理程序

结论

虽然我个人最喜欢的Windows开发是StrSafe库,但我的建议是尽可能使用ANSI C函数,因为便携式代码总是一件好事.

在现实生活中,我开发了一个个性化的可移植库,其原型类似于Security-Enhanced CRT功能(包括基于强大的模板的技术),它依赖于Windows上的StrSafe库和其他平台上的ANSI C功能.