我遇到了将代码库从 linux (gcc) 移植到 windows (msvc) 的问题。似乎 C99 函数 vsscanf 不可用并且没有明显的替代品。

我已经阅读了使用内部函数 _input_l 并静态链接到 crt 运行时的解决方案,但不幸的是我无法静态链接,因为它会干扰应用程序加载的所有插件(作为 dll)。

那么是否有任何替代品或一种为 vsscanf 编写包装器的方法?

更新 2016-02-24 :

当第一次被问到时,没有原生替代品,但从那时起,MSVC 已经实现了对此的支持以及更多。

  • VS2013 和更高版本实现 vsscanf 和 friend 。
  • C++11 也包括支持。
  • 最佳答案

    一个应该有效的黑客:

    int vsscanf(const char *s, const char *fmt, va_list ap)
    {
      void *a[20];
      int i;
      for (i=0; i<sizeof(a)/sizeof(a[0]); i++) a[i] = va_arg(ap, void *);
      return sscanf(s, fmt, a[0], a[1], a[2], a[3], a[4], a[5], a[6], /* etc... */);
    }
    

    将 20 替换为您认为可能需要的最大参数数。这段代码的可移植性不是很强,但它仅用于一个特定的损坏系统,缺少 vsscanf,所以应该没有太大关系。

    10-08 06:00