从stdin读取数字行

时间:2014-05-12 13:30:29

标签: c++

我正在研究用矩阵计算的程序,但我不确定如何从命令行逐行读取矩阵的最佳方法。

我的目标是:

Please enter number of lines:
2
Please enter line 1/2:
1 4 5 2 
Please enter line 2/2:
1 5 7 8

在此结束时,我希望有数组或数字1,4,5,2,1,5,7,8。

这是我的代码:

vector<string>matrix;
string input;
int nrows;
cout << "Enter number of rows:" << endl;
cin >> nrows;
getline(cin, input);
for (int i = 1; i <= nrows; i++) {
    cout << "Enter line " << i << "/" << nrows << endl;
    getline(cin, input);
    matrix.push_back(input);
}
for (int i = 0; i < matrix.size();i++){
    cout << matrix.at(i)<<endl;
}

这会读取整行并将其保存到字符串向量中,并且还有很多工作要将数字分开。有什么方法我怎么才能加载行中的数字?例如,对于这一行:

1 a 3 2 4sdsd

我会得到数字1,3,2,4?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

string process(const string& input)  // Removes all characters except <space> and digits [0-9]
{
    string ret;
    for(int i=0; i<(int)input.size(); i++)
    {
        if(input[i]==' '||(input[i]>='0'&&input[i]<='9'))
            ret+=input[i];
    }
    return ret;
}

int main()
{
    int nrows;
    string input;
    cout<<"Enter number of rows - ";
    cin>>nrows;
    cin.get();  // Take the remaining <Enter>
    vector<vector<int> > matrix(nrows);  // A 2-D vector representing the matrix
    for(int i=0; i<(int)matrix.size(); i++)
    {
        cout<<"Please enter line "<<i+1<<"/"<<nrows<<" -: \n";
        getline(cin,input);
        stringstream ss(process(input));
        int num;
        while(ss>>num)
        {
            matrix[i].push_back(num);
        }
    }

    for(int i=0; i<(int)matrix.size(); i++)  // Display the matrix
    {
        for(int j=0; j<(int)matrix[i].size(); j++)
        {
            cout<<matrix[i][j]<<" ";
        }
        cout<<"\n";
    }
}

答案 1 :(得分:2)

我会使用2D矢量。另外,询问用户列数:

vector<vector<int>> matrix;

int nrows, ncols;
cout << "Enter number of rows:" << endl;
cin >> nrows;
cout << "Enter number of columns:" << endl;
cin >> ncols;
matrix.resize(nrows);
for (int i = 0; i < nrows; i++) {
    cout << "Enter line " << (i+1) << "/" << nrows << endl;
    int tmp;
    while (matrix[i].size() < ncols) {
        while (!(cin >> tmp)) { // Not a number. Clear cin
            cin.clear();
            cin.ignore(1);
        }
        matrix[i].push_back(tmp);
    }
}

答案 2 :(得分:1)

一种方法:

// only allow digits and spaces
string removeNonNumbers(const string& s) {
  stringstream ss;
  for(int i=0; i<s.length(); ++i) {
    if(isdigit(s[i]) || ' ' == s[i])
      ss << s[i];
  }
  return ss.str();
}

vector<int> splitToInts(const string& s) {
  vector<int> ret;
  stringstream ssin(s);
  while (ssin.good()){
      string tmp;
      ssin >> tmp;
      ret.push_back(atoi(tmp.c_str()));
  }
  return ret;
}

要使用它,请在getline循环中读取输入时执行此操作:

vector<int> numbers = splitToInts( removeNonNumbers(input) );