【问题标题】:(C) Scanf - input gets 0 every time(C) Scanf - 输入每次都为 0
【发布时间】:2019-07-24 19:29:57
【问题描述】:

每次我在a之后在b中设置一个值,该值在a中重置为0 . 换句话说,在代码中,无论我在 a 中输入什么,在第二个 scanf 函数之后它总是 0

编辑:我需要使用 b 作为文章的 char 类型,以提高内存效率,所以我不能将 b 设置为 int,但我需要在其中输入整数。

EDIT2:我需要在b中输入一个整数,例如输入:

1

2

如果我从那点开始

printf("%d",a);

我得到 0。

unsigned short a;
char b;
scanf("%hu",&a);
scanf("%d",&b);

【问题讨论】:

  • "%d" in scanf() 需要一个指向 int 的指针。您正在传递一个指向 char 的指针并调用 Undefined Behaviour。试试int b;
  • 是否保证整数值在CHAR_MIN(-127)和CHAR_MAX(127)之间?或者,提出一个一般性问题:您正在读取的第二个值的范围是多少?
  • 问题编辑说你想在b中输入一个整数值。这只能是 0..9 范围内的单个数字,然后需要对其字符值(通常是 ASCII)进行调整,例如 scanf(" %c", &b); b -= '0';
  • @meaning-matters 是的,这是有保证的。
  • @xing 完美!您可以将此评论添加为答案,以便我接受吗?

标签: c input char output scanf


【解决方案1】:

您使用了错误的格式说明符

scanf("%d", &b);

应该是

scanf("%c", &b);

但是,由于之前有 scanf 语句,缓冲区中仍有一个换行符,您可以使用来过滤掉它

scanf(" %c", &b);

大多数格式说明符会自动过滤掉前导空格,但 %c%[]%n 不会。

从错误中不清楚是格式说明符有问题,还是变量类型有问题。

【讨论】:

    【解决方案2】:

    %d 需要int

    int b;
    

    然后,您应该检查scanf() 调用的返回值。两个调用都返回1吗?

    scanf() 返回分配的输入项数。因为您的两个调用都有一个%...,所以在这两种情况下都必须返回1。)

    【讨论】:

    • 为了提高内存效率,我需要使用 b 作为 char 类型的文章。
    • 在这种情况下,Weather Vane's great answer 就是您所需要的。无论如何,请检查scanf() 的返回值是否为1
    • @artmo-CSstudent 问题中没有足够的信息。请显示一个示例输入。
    【解决方案3】:

    使用char b;scanf("%d",&b);,scanf 会将sizeof (int) 字节写入b。
    这会损坏其他内存。
    scanf("%hhd",&b); 只会向 b 写入一个字节。

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 2021-05-27
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2013-08-14
      • 2022-09-29
      相关资源
      最近更新 更多