有关较旧的MS C / C ++格式说明符的问题

时间:2019-07-13 00:45:23

标签: visual-c++

了解一些导致崩溃的代码。它很古老(从90年代或更早),但是最近开始使用更新的编译器来体现。其中一些代码将sprintf与格式说明符结合使用,例如:

sprintf(buf, "here is some stuff %ld pieces of %ld samples from %Fs", someIntValue, someOtherIntValue, someCharStarPointer);

第三个参数是导致崩溃的原因...根据文档,%F用于浮点数,它将仅在浮点数之后打印s。

我的问题是,%Fs是否曾经是旧版Microsoft编译器的有效格式?就像当存在混合内存模型时,F可能已经表明它是一个遥远的指针了吗? IDK,抓着稻草。显然,我们将修复%F使其仅使用%s,但我想知道旧计时器是否还记得这样的东西?

1 个答案:

答案 0 :(得分:1)

来自FreeDos sources

STATIC void do_printf(CONST BYTE FAR * fmt, va_list arg)
{
    ...
    case 's':
        p = va_arg(arg, char *);
        break;
    case 'F':
        fmt++;
        /* we assume %Fs here */
    case 'S':
        p = va_arg(arg, char FAR *);
        break;

因此,将%Fs用于FAR指针是正确的。