【问题标题】:Trying to store invalid hexadecimal number in int variable试图在 int 变量中存储无效的十六进制数
【发布时间】:2020-08-16 21:45:59
【问题描述】:

我有一个非常基本的疑问。我正在尝试将任何无效的十六进制数存储在 int 变量中。无效数字是指使用不在A-F 范围内的字母的数字。例如看这个程序:

#include<stdio.h>
int main()
{
    int a;
    scanf("%X",&a);
    printf("%d",a);
    return 0;
}

当控制台要求输入时,我输入了G。它的输出为63。它只是未定义的行为还是这个输出背后有一些逻辑。对于大多数此类输入,输出为63。目前正在研究 GCC。

【问题讨论】:

  • scanf("%X",&amp;a); ==> if (scanf("%X", &amp;a) != 1) exit(EXIT_FAILURE);
  • 试试int a = 12345;,看看a会发生什么。
  • @chux - 这次恢复 Monica Ya,如果我输入任何无效的十六进制数字,它会打印 12345,否则它会打印十六进制数字的小数。

标签: c gcc int hex undefined


【解决方案1】:
 scanf("%X",&a);

%X 将只寻找十六进制输入。如果您输入G,该指令将失败,并且不会发生对a 的赋值。在这种情况下,scanf() 返回0,它指定了成功消费的项目数。

您应该通过检查scanf()的返回值来检查是否所有项目都被成功消费:

if(scanf("%X",&a) != 1) {
    fprintf(stderr, "Error occurred at scanning hexadecimal input!");
}

“当控制台要求输入时,我输入了G。它给出的输出为63。它只是未定义的行为还是这个输出背后有一些逻辑?”

由于a 未初始化:

int a;

并且在 scanf() 调用中没有成功消费,这会为 a 分配一个合理的值,a 仍然包含垃圾值,因为它是默认存储持续时间 automatic 的对象.

打印这个垃圾值实际上调用了未定义的行为。

【讨论】:

  • 所以这意味着%X 将只允许将十六进制值存储在变量a 中。任何非十六进制值都将被忽略。对吧?
  • 将“可以检查”替换为“应该检查”。
  • @Noshiii "任何非十六进制值都将简单地停止此scanf("%X",&amp;a) 并且G 保留在stdin 中用于下一个输入功能。
  • @Noshiii 这将帮助您在“描述”下的“格式控制字符串”小节下的scanf() 上下文中理解术语“指令” :users.pja.edu.pl/~jms/qnx/help/watcom/clibref/src/scanf.html
  • @Noshiii:C 标准将scanf 的格式字符串称为“指令”,因为它们指示scanf 做什么。该术语在 C 2018 7.21.6.2 3 中,指令包括以% 开头的空白字符、普通字符和转换规范。预处理器指令也称为“指令”,但它们之间通常不会混淆,因为上下文通常会清楚地说明我们在谈论什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2020-02-02
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多