Scanf语法 - %6d和%-6d以及%0d

Nad*_*dav 0 c scanf format-specifiers

什么是使用之间的区别scanf有以下格式说明,当被扫描的输入是123456与当它是123:

  • %6d
  • %-6d
  • %0d

输出有什么不同?

Mic*_*zek 5

我最后只是尝试使用GCC 4.3.4,并获得以下内容:

  • %6d: 工作良好; 只读取6个字符(因此,如果您尝试阅读123456789它只会读取123456)
  • %-6d:发出警告:

    warning: unknown conversion type character '-' in format
    
    Run Code Online (Sandbox Code Playgroud)

    不读取任何内容,并且正在写入的int未经修改

  • %0d:发出警告:

    warning: zero width in scanf format
    
    Run Code Online (Sandbox Code Playgroud)

    读取就好像格式说明符中没有宽度(%d)

我没有检查规范,看看这些结果是否是强制性的,或者只是GCC如何处理它(编辑:AndreyT发现它)


AnT*_*AnT 5

%-6d是一个无效的格式说明符.有没有格式说明-在他们scanf.

%6d6部分称为最大字段宽度.它适用于所有格式说明符(不仅适用于d),并指定在执行任何特定于格式的转换之前要读取的最大字符数.例如,如果输入序列是1234567,那么%3d将读取并转换123%6d将读取并转换123456.

%0d是一个无效的格式说明符.最大字段宽度scanf必须是非零整数(请参阅语言规范中的7.19.6.2/3).

因此,这使我们%6d成为您提供的三个中唯一有意义的格式说明符.在这种情况下,关于产出差异(结果?)的问题没有多大意义.

编辑:人们可能会争辩说,在%-6d-6部分是最大字段宽度,它满足非零十进制整数的标准要求.但是,在C语言术语中,作为词汇元素的十进制整数仅是数字和数字的序列.不允许包含标志.即既不是十进制整数-6也不+6是十进制整数.每次在程序中使用-6+6作为整数时,它实际上是一元-+运算符lexeme后跟十进制整数lexeme.因此,由于规范scanf要求非零十进制整数作为最大字段宽度,因此它必须是无符号整数.