【问题标题】:double value to int variable- unexpected output双值到 int 变量 - 意外输出
【发布时间】:2013-06-11 16:30:48
【问题描述】:

这是一段简单的代码。实际上它是一个“填充数组”功能代码。

#include <iostream>
 using namespace std;
int main(){ 
   int size = 10; a[10]; numberUsed;
   cout << "Enter up to " << size << " nonnegative whole numbers.\n"
   << "Mark the end of the list with a negative number.\n";
   int next, index = 0;
   cin >> next;
   while ((next >= 0) && (index < size)){
      a[index] = next;
      index++;
      cin >> next;
   }
  numberUsed = index;
  for(int i = 0 ; i < numberUsed -1 ; i++){
 cout << a[i]  << endl;
  }
}

当用户输入整数时它工作正常。但是当我输入双精度值时,它应该转换该特定值。并为下一个输入的整数重复该值。 所以现在输入 1 2 3 4 5 6.5 7 8 9 -1 。我得到以下输出 1 2 3 4 5 6 6 6 6 6 任何帮助将不胜感激。

【问题讨论】:

  • 您的程序无法编译。另外,为什么需要numberUsed
  • 我的猜测:它无法解析“。”因为整数中没有“.”,所以它卡在流管道中。所以 next 没有被修改(保持在 6)并且被一遍又一遍地存储
  • 如果您将第 4 行中的分号替换为逗号,则程序将编译。发帖人可能正在使用接受该语法的非标准编译器。
  • 当我用给定的输入输入给定的代码时,我得到 1 2 3 4 5 6 0 0 0 0。我可以确认 @AK4749 是正确的,因为 cin 有一个错误标志。奇怪的是我的输出不一样。
  • 对分号表示歉意...用逗号代替这些分号..

标签: c++ int double


【解决方案1】:

你告诉cin 读取一个整数,这就是它要做的事情——它会在看到一个对整数无效的字符时立即停止。在这种情况下,它是'.'。尝试读取更多整数只会继续失败,在您的情况下,将 next 保留为之前的值。

如果要截断浮点值,请读入浮点变量,然后自己进行截断。

double next;
...
a[index] = (int) next;

【讨论】:

  • 哦.. 所以如果我定义一个 int 类型的变量。 cin 实际上对输入的内容“有意识” ???你是这么说的吗?
  • @user128806 是的!这就是它的美妙之处。否则,您将只使用 printf(),它在大多数情况下会更快
  • @MarkRansom +1 我在这里认识了您和您的“精确性”,想知道您是否可以对这种情况下的 6 对 0 结果发表评论。我怀疑是 UB 从失败的流中读取,但无权访问标准。你愿意提供这样的澄清吗?谢谢
  • @AK4749,感谢您的信任投票,但实际上我更像是一个实用主义者而不是语言律师。根据en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt,定义的行为在 C++11 中更改为始终返回零,在此之前它保持不变。
  • @MarkRansom 完美,这就是我想听到的全部内容哈哈——这正好解释了差异
【解决方案2】:

当读取整数值时(并且您的代码正在使用int next;,任何不是整数的东西都会“停止”每次读取其他任何东西时的输入。因为next 在遇到@ 时为6 987654323@ 在输入流中,它会继续用该值填充数组,直到空间用完。

如果您检查输入的状态,例如if(!cin &gt;&gt; next) ... error handling ...;,您可以检测到何时出现问题。作为错误处理的一部分,您应该“忽略任何输入,直到出现空格” - cin.ignore(1000, ' '); 将是一个好的开始。您还需要重置cin 上的错误标志,以免下次出现错误,cin.clear() 会这样做。

如果要输入浮点数,则需要使用floatdouble 类型作为next(以及数组a)。

【讨论】:

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