【问题标题】:Using scanf() to read "00"使用 scanf() 读取“00”
【发布时间】:2017-02-08 17:18:53
【问题描述】:

我对编程非常陌生,正在尝试仅使用数字制作基本的美式轮盘游戏,板上出现的一个数字是“00”,我正在尝试将“00”分配给结构中的变量数组,我不知道如何做这个特定的数字,因为它读为“0”。这是我用来设置它的代码,对于这个可能非常愚蠢的问题,我很抱歉,但我已经搜索了几个小时,只有非常复杂的答案出现了,我还无法理解(尽管我已经尝试过)。由于我根据要求使用的非常基本的编译器,因此需要将输入读入一个,这样输入将是“number number number number number number number”。

#include <stdio.h>
#include <string.h>

int main( void )
{
    struct bet /* Setting up a structure array to store input values */
    {
        float number;
        float betValue;
    } playerBet[4];

    scanf("%f %f %f %f %f %f %f %f", &playerBet[0].number, &playerBet[0].betValue, &playerBet[1].number, &playerBet[1].betValue,&playerBet[2].number, &playerBet[2].betValue,&playerBet[3].number, &playerBet[3].betValue);
}

任何帮助将不胜感激!

【问题讨论】:

  • 如果您将输入作为字符串,您可以检查"00",然后调用它,例如37。否则sscanf 提取数字的字符串。但我建议不要将float 用于整数值。我还建议不要使用float 来赚钱:最好以美分工作。如果你必须使用浮桥,千万不要使用float,你可以使用double
  • 我不知道。所以它必须被读取为一个字符串。
  • @WeatherVane 非常感谢,我现在可以读取“00”。我还没有被介绍给 sscanf,那我可以用它来比较数字吗?我将使用 switch 语句来检查我是否有获胜值,因此对于 case 语句从 playerBet[0].number 中提取数字,我将使用 sscanf?
  • 在获得fgets 的输入后,您使用sscanf 的方式与scanf 类似。请参阅手册页。一大优点是,与scanf 不同,当输入要求不满足时,该功能不会“阻塞”。始终检查这些函数的返回值,它会告诉您转换了多少项。我建议您将"00" 视为37,因为您在0...37 范围内有38 个数字,您可以制作037 的特例(实际上是"00")。此外,可以从值中提取“红/黑”和“奇/偶”等,减少case语句的数量。
  • @WeatherVane 我现在已经实现了 fgets 和 sscanf,非常感谢您指出正确的方向,这比使用 scanf 更有意义。我对您将 00 视为 37 的意思感到有些困惑,我该怎么做?抱歉问题太多了,我边走边学。

标签: c scanf


【解决方案1】:

对于浮点数和整数,000 无法区分。正如@Weather Vane 在 cmets 中指出的那样,您可以使用 sentinel value 来区分双零。您还可以将每个数据点作为字符串输入(因为"0" and "00" 在解释为字符数组时被区分为不同)。

对于这类简单的小项目(可能是作业问题),您可以使用atoi() 将字符串转换为数值以解析您的输入。

您可能应该在内部使用整数对数据进行建模。这将确保您在检查输入的均匀性或奇异性时不会遇到问题。您的数据结构似乎不需要对浮点数据进行建模。

示例

将结构元素 number 设为整数,将 betValue 设为 float

int number;
float betValue;

输入数字为字符串并解析:

char input_number[3]; // 2 spaces plus null terminator
int number;           // numeric version (after parsing)
float bet_value;      // float value for bet
scanf("%s %f", input_number, &bet_value);
if (input_number[0] == '0' && input_number[1] == '0') {
    number = 37;
} else {
    number = atoi(input_number);
}
// Assign them to structure
playerBet[0].number = number;
playerBet[0].betValue = bet_value;

【讨论】:

  • 使用整数的好处是(000 不适用)板的区域很容易计算。红/黑、高/低等,以及像“街”和“角”这样的投注烫发。
  • 我同意,但是对于输入,您不希望用户必须输入"37",因此您可能会输入一个字符数组然后解析它。
  • 您也不希望用户输入-1100。当然,必须进行一些错误和范围检查。
  • 当然,但那是题外话。我是说使用37 的标记值很好,但不适用于用户输入。 OP 应该将此数据作为字符数组输入,以便用户可以输入 00 并让软件将其解释为 37(或者 OP 希望在内部对数据进行建模)。
  • 是的,我同意,整数也应该用于对内部数据建模(而不是浮点数)。我只引用了那些,因为 OP 在问题中做了。
猜你喜欢
  • 2021-01-29
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 2012-03-18
  • 2013-06-22
  • 2023-03-31
相关资源
最近更新 更多