【问题标题】:Checking for non-numeric input and assigning to a double in C++?检查非数字输入并分配给 C++ 中的双精度值?
【发布时间】:2010-06-09 22:34:53
【问题描述】:

这是我目前拥有的代码:

char ch;
int sum = 0;
double values[10];
int i = 0;
cin >> ch;

while (!isalpha(ch))
{  
    values[i] = ch; 
    sum += values[i]; 
    i++;  
    cin >> ch;
}

发生的情况是,如果我输入值 1,它会作为字符分配给 ch。现在 ch 将其值分配给 double 并进行隐式转换。所以它将'1'的ASCII值分配给values[i]。我希望它只将 1 分配给值 [i]。有一个更好的方法吗?还是我遗漏了什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果你想将一个数字字符转换成它对应的数字值,你可以简单地从中减去'0'

    char ch = '2';
    int value = ch - '0'; // value is 2
    

    但是,读取浮点数的最佳方法是从cin 中提取doubles:

    double value = 0;
    if (cin >> value)
    {
        // value is good
    }
    else
    {
        // invalid value was entered; handle the error appropriately
    }
    

    请注意,如果提取失败并且您想继续从流中读取,则需要调用 cin.clear() 来清除流的失败状态,并且您可能需要调用 cin.ignore() 以忽略任何尾随字符 (例如,如果您使用基于行的输入,则需要忽略所有内容,直到下一个换行符。

    【讨论】:

    • 我觉得有些东西对我来说很有吸引力。所以用你的例子,我可以做这样的事情吗? if (cin >> isdigit(value)) { //值好 }
    • 不,你为什么要这样做?如果cin无法提取出与类型匹配的值,则会进入fail状态,并且不会进入if分支。
    • @Brundle: No... isdigit() 测试字符是否为数字;你不能cin >> isdigit(value)。只是cin >> value,其中valuedouble,它将尝试读入并处理浮点值的格式转换。如果失败,则if 测试将失败。 (哦,GMan 比我解释得好)
    • @Brundle 我认为您缺少的是cin >> value 固有地确定输入对于value 的类型是否有效。重载的>> 运算符暗示了这一切。
    • 感谢您清除 if 语句中的 cin >> 值。我试着把我的代码改成这个,一切都很好。我知道这是一件我不理解的小事。
    【解决方案2】:

    将整个数字读取为字符串,然后使用strtod 函数或其他一些特定于C++ 的方法将整个数字转换为double

    【讨论】:

      【解决方案3】:

      虽然这不是一个好的解决方案,但从技术上讲,您可以在分配数组元素时从 char 变量中减去 '0' 的 ASCII 码:

      char ch;
      int sum = 0;
      double values[10];
      int i = 0;
      cin >> ch;
      while (!isalpha(ch))
      {  
          values[i] = ch - '0'; 
          sum += values[i]; 
          i++;  
          cin >> ch;
      }
      

      如果 ch 是一个数字 (0-9),那么 ch-'0' 会以“int”形式给你那个数字 ch('0' 是 ASCII table 中的 dec48,数字 0 到 9 是从 dec48 到 dec57)。

      虽然这有点小技巧,可能不应该真正使用,但是,它是一个可能的解决方案。

      【讨论】:

      • 实际上,要求数字在执行字符集中按顺序排列,因此ch - '0' 根本不是真正的hack(尽管通常有更好的方法来处理输入)。
      【解决方案4】:

      字符串流应该能够为您进行转换。通过 atoi 也可以完成工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-07
        • 2012-11-07
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多