【问题标题】:Scanf-reading variables which have to meet ceratin specifications必须满足某些规格的 Scanf 读数变量
【发布时间】:2013-11-21 11:55:10
【问题描述】:

我必须解决一个乍一看似乎很简单的练习。但是,我不太确定如何解决它。鉴于变量ab 具有某些可接受的值,我是否应该在阅读它们后验证它们是否在正确的范围内?关于变量b,在示例中它是用科学记数法给出的,所以我应该使用e 说明符来阅读它吗?最后但并非最不重要的一点是,',' 的分配抑制是使用"%*[,]" 完成的?

编写一组语句,从标准输入读取三个变量abc,其中变量有以下类型:

a - 无符号短整数,b - 浮点数,c - 最多 31 个字符的字符串

输入值用一个逗号分隔。第一个变量以八进制数给出。 a 和 b 的允许值如下:

-4331 < a <= 28731
-1035 < b < 9749273 

如果值不在允许的范围内或格式错误,则应给出适当的错误消息。样本输入:

12745, -1.e-3, Is this a good one? 

0xEE04F, 21e75, Maybe this one... 

70073, 21e+6, Or this one. Could this string be too long to put into allocated area?

【问题讨论】:

  • 除非您真正阅读它们,否则实际上无法验证值。您可以通过检查来自scanf 的返回值来验证您scanf 的输入类型是否正确。
  • 如果您可以使用 Linux 机器,scanf 的手册页非常全面。 (如果没有,您应该可以通过快速的 Google 搜索找到它。)您还需要了解 scanf 之间的分工以及在调用 scanf 后需要编写的代码以进行验证您的意见。

标签: c++ c variable-assignment scanf


【解决方案1】:

OP:我应该在阅读后验证它们是否在正确的范围内吗?
答:是的。扫描将检查总范围误差。然后代码检查本地范围。

OP:使用 e 说明符阅读它?
答:aefgscanf() 家族中都是等价的。所以使用看起来合适的东西:e 很好。

OP:',' 的赋值抑制是使用"%*[,]"完成的
A:差不多:可以使用“%*1[,]",但","就足够了。

使用fgets()sscanf(),然后检查范围。

char buf[1000];
if (fgets(buf, sizeof buf, stdin) == NULL) {
  handle_EOF_or_IOError();
}
short Number;
float x;
char s[31+1];
if (3 != sscanf(buf, "%ho,%e, %31[^\n]", &Number, &x, s)) {
  handle_ParseError();
}
short NumberTooSmall = -4331;
short NumberMax = 28731
float xTooSmall = -1035.0f;
float xTooBig = 9749273.0f;
if ((Number <= NumberTooSmall) || (Number > NumberMax) ||
    (x <= xTooSmall) || (x >= xTooBig)) {
  handle_RangeError();
}

注意:当解析的字符串以“12745,-1.e-3,这是一个好的吗?”等开头时存在一个微妙的问题。OP 说 , 是分隔符。这意味着字符串以" Is this ..." 开头。我认为 OP 想要跳过前导空格并获得 "Is this ..."

假设IEEE binary32 代表float9749273.0 需要 24 位来准确表示。由于这种格式对于普通数字具有 23+1 位的精度,所以一切都很好。应注意浮点值的范围测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2021-11-29
    • 2020-12-06
    • 1970-01-01
    • 2015-10-13
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多