【问题标题】:Scanning and printing char variables in C [closed]在 C 中扫描和打印 char 变量
【发布时间】:2018-07-12 13:30:12
【问题描述】:

为什么打印x总是等于0?

#include <stdio.h>

int main()
{
    unsigned char num, x, nnum, y = 0;
    printf("please enter the number of bits u want to clear \n");
    scanf("%d%d", &x, &y);
    printf("%d%d", x, y);
    return 0;
}

我尝试将它们分开放置,但在从 y 获取变量后,x 变为零。 我知道它们最终会存储在堆栈中,每个 char 是 1 个字节,所以在打印它们时 它们都应该具有我输入的价值。

【问题讨论】:

  • 您在对scanf() 的调用中使用了错误的格式。您会以覆盖的形式获得未定义的行为。
  • 为什么不将xy 设为int 类型?然后%d 将按您的预期工作,而您不必与%hhu 混为一谈。
  • 为什么会有一个未定义的行为我试图让它尽可能少占用空间@JonathanLeffler
  • 您告诉scanf() 您正在提供指向 4 字节(可能)整数的指针;您为它提供指向 1 字节字符的指针。它会相信你的话。在某些系统上,代码可能会崩溃;在其他情况下,它会很慢,并且会覆盖不打算写入的数据。行为是未定义的,所以这两个都是有效的反应,
  • 1.对于像 xy 这样的单个变量,使用小于 int 的变量将不会节省内存。所以你会遇到很多麻烦而没有真正的效果。 2. 如果xy 实际上是unsigned charuint8_t,您可以使用"%hhu` 或"%"SCNu8 扫描它们,正如我们一直告诉您的那样。(我知道您尝试过并且它不起作用。再试一次。)

标签: c printf scanf


【解决方案1】:

在您的代码中,

 scanf("%d%d",&x,&y);

undefined behavior。转换说明符和提供的参数不匹配。对于 scanf() 系列,%d 需要一个指向有符号整数的指针类型的参数,而您提供的是指向无符号 char 的指针。

你需要使用

 scanf("%hhu%hhu",&x,&y);

【讨论】:

  • 当我使用一个变量时它可以工作
  • @AliIbrahim 嗯,它似乎有效。这就是未定义行为的美妙之处。阅读我的答案中的链接。
  • 我也试过 scanf("%hhu%hhu",&x,&y);仍然不工作 x 将是一个零
  • @AliIbrahim 你也改变了 printf 吗?
  • @AliIbrahim 你不能使用scanfscanf 是一个老派功能,使用时必须非常小心地遵守规则。听起来您对仔细遵守规则不感兴趣;听起来你只是想让事情按照你认为应该工作的方式工作。这很好,但是这意味着你永远无法成功调用scanf。它不适合你的编程风格。
【解决方案2】:

char 的格式说明符是 %c。使用 %d 会导致未定义的行为(覆盖堆栈上的下一个变量)。

如果您想要一个 8 位无符号整数,请使用 uint8_t (stdint.h) 以及 inttypes.h 中的 SCNu8 和 PRIu8 宏。

【讨论】:

  • 我见过很多代码将整数分配给 char 变量
  • 编译会将数字转换为二进制然后将其放入 char 中(例如,我输入 7 然后 7 )编译器会将前 7 转换为 00000111,然后将第二个转换为变量
  • 问题不在于将整数放入 char 变量中。这是因为系统之间的 char 不同,并且 char 中整数的格式说明符也不同。 uint8_t、SCNu8 和 PRIu8 会给你正确的东西或不存在(不太可能)。即使您为某些系统获得正确的格式字符串,使用 char 也会给您带来未定义的行为。
  • 你的意思是 scanf("%d",&should be integer variable not a char var.);对 ?我见过一些程序员这样做吗?
  • 不仅仅是一个整数。 %d 必须是正确大小的整数,int 将始终有效。一个 char 可能会起作用,例如在只有 16 位整数和字符的 DSP 上。它不适用于 x86/amd64。
【解决方案3】:

数据类型是char,所以char的scanf基本上是%c。要么你会分开它的变量。如果您的 x 是一个字符,那么您需要分隔到下一行。整数的 scanf 是 %d。

【讨论】:

  • 十进制 转换为unsigned char 的格式说明符是%hhu - %c 读取的是单个字符 而不是十进制数.
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多