%zd说明符是C11中的可选功能吗?

时间:2017-02-21 09:15:50

标签: c scanf c11 format-specifiers

我使用了一个非常简单的代码:

int main(void)
{
    size_t variable;
    /*prompt*/
    printf("enter the value of the variable: ");
    scanf("%zd", variable);
    printf("you entered %zd value of the variable", variable);
}  

但是,GCC编译器会产生以下结果:

Enter the vale of the size_t variable: 15
You entered zd value of size_t type
Process returned 35 (0X23)  execution time: 3.094s
Press any key to continue

我的书也直接演示了上面的例子,但没有提到它是某种特殊的格式说明符,如果要包含库文件的话。 即使the online compiler也没有产生正确的结果。 为什么代码不起作用?

2 个答案:

答案 0 :(得分:6)

scanf("%zd", variable);

是未定义的行为,因为您没有传递指针。

printf("you entered %zd value of the variable");

也是未定义的行为,因为您使用了格式说明符但未传递匹配的参数。

%zd是C11托管实施的强制功能。这意味着任何实现stdio.h的编译器都必须使用它。但是,%zd没有多大意义,因为size_t始终是无符号的。请改用%zu

请注意,标准库的不兼容实现存在,最明显的是Microsoft的Windows实现。 Visual Studio以及gcc / mingw编译器使用标准库的Microsoft实现。该库不支持%zu,因为它不符合C11标准。

答案 1 :(得分:2)

Nopes,%zd是实现符合要求的格式说明符之一,它不是可选

引用C11,章节§7.21.6.2,fscanf()

  

z指定以下diouxX或{ {1}}转换说明符适用   使用指向n的指针或相应的签名的参数   整数类型。

那就是说,在你的代码中,用法是错误的,原因有两个。

  1. 您需要传递指向类型的指针作为提供的转换说明符的参数。
  2. size_t被定义为无符号整数类型,因此您应该使用适当的格式说明符size_t,而不是%zu

    再次引用%zd,章节§7.19

      

    C11

         

    是sizeof运算符的结果的无符号整数类型;

  3. 这样的东西
    size_t

    应该可以正常工作。