【问题标题】:what does it mean to assign a scanf statement to a variable?将 scanf 语句分配给变量是什么意思?
【发布时间】:2017-05-08 22:10:37
【问题描述】:

我最近看到一个让我头疼的答案, 那家伙写了这段代码,它的值为1。 cr 是一个整数。

cr = scanf("%d %.2f",&x,&y)

那么你怎么能这样做呢?为什么它给出 1?

【问题讨论】:

  • 您是否尝试过阅读文档?查找RETURN VALUE 部分。
  • google 'man scanf'
  • 您是否查找过有关 scanf 的文档以及它的返回值是什么?文档在你头上吗?
  • %.2f 应该是%f(假设float y;)。与printf 的输出规范混淆。 scanfprintf 这两个函数在格式规范上有一些相似之处,但又有所不同。函数scanf 给出了 1,因为它无法转换为第二个目标。
  • %2f. 导致未定义的行为

标签: c scanf


【解决方案1】:

首先,由于scanf 语句存在问题,您显然会得到 1。正如@weathervane 所说,您需要从那里删除.2

cr = scanf("%d %.2f",&x,&y)

到这里:

cr = scanf("%d %f",&x,&y)

当您打印 cr 时,您将获得 2 而不是 1 的值。您在该 scanf 语句中添加另一个要扫描的 var 并打印它,您将看到值 3。

#include <stdio.h>

main(){
    int x, cr, z;
    float y;

    cr = scanf("%d %f %d",&x,&y, &z);
    printf("%d\n", cr);
}

输出:

56
5
2
3

如您所见,cr 正在存储正在使用的 var 的数量。

【讨论】:

    【解决方案2】:

    scanf的原型是

    int scanf(const char *format, ...)
    

    函数返回一个整数,告诉你有多少参数被成功读取。所以,你有:

    int cr = scanf("%d %.2f", &x, &y);
    

    您有 2 个参数( x 和 y ),所以如果两个参数都被成功读取, cr 将为 2。但是你得到 cr = 1。这意味着 1 个参数没有被成功读取。

    正如@narusin 指出的那样,这是因为格式说明符 %.2f 是错误的。如果您使用 gcc 进行编译,它会通过警告(第 3 行)告诉您:

    tmp $ gcc scanf_t.c -o scanf_t
    scanf_t.c: In function ‘main’:
    scanf_t.c:9:2: warning: unknown conversion type character ‘.’ in format     [-Wformat=]
    n = scanf("%d %.2f", &x, &y);
    ^
    scanf_t.c:9:2: warning: too many arguments for format [-Wformat-extra-args]
    

    要读取浮点数,格式说明符应该只是 %f

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2011-11-18
      • 2015-07-15
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多