【问题标题】:Is the %zd specifier an optional feature in C11? [closed]%zd 说明符是 C11 中的可选功能吗? [关闭]
【发布时间】:2017-07-10 19:52:46
【问题描述】:

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

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 也没有产生正确的结果。 为什么代码不起作用?

【问题讨论】:

  • 因为您调用了printf 却没有传递说明符的参数。
  • 如果您打开更多警告,您会看到您将variable 而不是它的地址 传递给scanf() .
  • "%zd" 需要匹配的 signed size_t 参数,但在您的情况下,size_t variable;long unsigned int。你在那里尝试什么?
  • 任何初级编程书籍的第一章都应该解释如何使用这些函数。您还必须弄清楚如何启用编译器警告。

标签: c scanf c11 format-specifiers


【解决方案1】:
scanf("%zd", variable);

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

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

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

%zd 是 C11 托管实现的强制性功能。这意味着任何实现 stdio.h 的编译器都必须这样做。但是,%zd 没有多大意义,因为size_t 始终是未签名的。请改用%zu

请注意,存在标准库的不兼容实现,最值得注意的是 Microsoft 针对 Windows 的实现。标准库的 Microsoft 实现被 Visual Studio 和 gcc/mingw 编译器使用。该库不支持 %zu,因为它不遵循 C11 标准。

【讨论】:

  • 问题的答案是什么? %zd 说明符是 C11 中的可选功能吗?
  • @KeineLust,抱歉打错了
  • @KeineLust 已更新。
  • @Lundin,请看这个:pasteboard.co/BkGB7RbyX.png
  • @bzal 请参阅上面关于使用非标准编译器的说明。我猜你在 Windows 下使用 gcc/Mingw(Windows 中 Codeblocks 的默认编译器),在这种情况下你得到的结果正是如此。原因是 Mingw 使用了微软蹩脚的非标准库。
【解决方案2】:

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

引用C11,第 7.21.6.2 章,fscanf()

z 指定以下 diouxXn 转换说明符适用 类型指针指向size_t 或相应的带符号的参数 整数类型。

也就是说,在您的代码中,使用错误有两个原因。

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

    再次引用C11,第 7.19 章

    size_t

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

类似

 scanf("%zu", &variable);

应该可以正常工作。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2015-03-01
  • 2012-06-23
相关资源
最近更新 更多