0

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

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

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?
4

1 回答 1

1

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

OP:使用说明符阅读它e
A: a, e, f,在家庭g中都是等价的。scanf()所以使用看起来合适的: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,需要 24 位float9749273.0准确表示。由于这种格式对于普通数字具有 23+1 位的精度,所以一切都很好。应注意浮点值的范围测试。

于 2013-11-09T23:30:59.207 回答