我正在写一个程序,它要求我以一种非常特殊的方式从用户那里接收double
输入,所以我正在学习流。
最后,我的目标是迫使用户按照我所希望的方式来格式化他们的输入,即:2.0 3.0 4.0
-〉双精度数(或整数),中间有空格,没有尾随空格
我一直在使用std::istringstream
以类似于以下示例的方式读取输入:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
int a[5] = {0};
while (1){
cout << "Input: ";
string s;
getline(cin, s);
istringstream buffer(s);
for (int i = 0 ; i < 5 ; i++)
buffer >> a[i];
for (int i = 0 ; i < 5 ; i++)
cout << a[i] << " ";
cout << endl;
}
}
我的问题是关于以下终端输入/输出:
Input: 1 2 3 4 5
1 2 3 4 5
Input: a b c d e
0 2 3 4 5
为什么字符的输出是以这种方式放入整数中的?
下面是另一个例子:
Input: 5 6 7 8 9
5 6 7 8 9
Input: a b c d e
0 6 7 8 9
对于第一个遇到的字符,它似乎默认为0
,然后重用流的其余部分,这就是我询问流位置的原因。
我的期望:
1.或者是相应的ASCII数字。
1.它们都是0
,因为(出于我想知道的原因),从流输入到整数中的字符往往默认为0
。
我相信输出的方式与流的位置有关,我希望对此进行解释(以及对默认0
字符的回答)。
基本上,我对流很好奇,想知道更多关于它们是如何处理的,这似乎是一个怪癖,可以突出这一点。
1条答案
按热度按时间d6kp6zgx1#
下面是对输出的完整解释。
我现在关注的是
a
的输入。第一步是因为
a
不是一个有效的整数而导致读取失败,这会使cin
流进入 error state,并将a[i]
设置为零。下一步是
cin >> a[i];
返回,程序打印第一步的值。现在流处于错误状态(从第一步开始),所有后续读取立即失败,没有对任何
a[i]
进行更改,因此打印以前的值。所以和水流位置无关。