我正在研究用矩阵计算的程序,但我不确定如何从命令行逐行读取矩阵的最佳方法。
我的目标是:
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?
感谢您的帮助。
答案 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) );