读取未知数量的输入

3
我需要使用C++或Java读取未知数量的输入。每行输入恰好有两个数字。我需要使用cinSystem.in Scanner,因为输入来自控制台而不是文件。
例如输入:
1 2

3 4

7 8

100 200

121 10

我想将数值存储在一个向量中。我不知道有多少对数字。如何设计一个while循环来读取这些数字,以便我可以把它们放入一个向量中?


1
是否有一个通过哨兵值指示最后一个非包含输入的指标?(通常是一个类似于-999或EOF的无意义值) - Casey
1
@Casey 不是的。每个数字都是包含在内的。当用户完成输入时,他会连续按两次回车键。 - tianz
5个回答

6
你可以在C++中使用惯用的std :: copy:(在此处查看使用虚拟输入字符串的工作情况
std::vector<int> vec;
std::copy (
    std::istream_iterator<int>(std::cin), 
    std::istream_iterator<int>(), 
    std::back_inserter(vec)
);

这样,每当从输入流读取一个整数时,它就会追加到向量中,直到由于错误输入或EOF导致无法读取为止。


我假定它们成对出现是重要的事实。 - Mooing Duck
@MooingDuck,确实,你可以有一个包装器来控制后插入,首先转到一对元素中的一个,然后转到另一个,然后转到新对的第一个。你也可以使用我的vec在所有数据都被读取后填充成一对向量。 - chris
我尝试使用pair来扩展这个答案,但是由于ADL,std::cout >> mypair不会使用我的重载。因此,您必须使用自定义结构体。 - Mooing Duck
@MooingDuck,看起来不错。我不确定为什么我没有想到一次输入两个值... - chris

4

Java:

Scanner sc = new Scanner(System.in);
String inputLine;
while(sc.hasNextLine()) {
  inputLine = sc.nextLine();
  //parse inputLine however you want, and add to your vector
}

循环无限进行。我正在逐一将inputLine放入ArrayList中。如何停止这个循环? - Udit Solanki

1

与使用缓冲读取器不同,可以使用以下方式使用Scanner来实现相同的功能

import java.util.*;

公共类Solution {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    while(true)
    {
        String Line = new String(scan.nextLine());
        if(Line.length()==0)
        {
            break;
        }
    }
}

}


0

我找到的唯一解决方法是:

import java.io.*;

class Solution {
    public static void main(String args[] ) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int i=1 ;
        String line =br.readLine();
        while(line.length()>0){
            System.out.println(line);
            line = br.readLine();
        }    
    }
}

0

对于寻找不那么花哨的 C++ 代码的人:

    #include<iostream>
    #include<vector>
    int main(){
        std::vector<int>inputs;  //any container
        for(int i;std::cin>>i;)  //here the magic happens
            inputs.push_back(i); //press Ctrl+D to break the loop
        for(int num:inputs)      //optional 
            std::cout<<num<<endl;
    }

你忘记了endl的命名空间范围。Ctrl-d是平台相关的。在评论中,提问者说“当用户完成输入时,他连续按两次Enter键”。你的程序没有识别出这个条件。 - Ludwig Schulze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接