Вам необходимо проанализировать ввод командной строки, который вы даете программе. Это может быть немного связано.
То, что вы можете сделать, - вы знаете, что этот массив будет двухмерным.
Передайте данные командной строки следующим образом:
myprogram <количество строк (r)> <количество столбцов (c)> n_1 n_2 n_3 .... n_ (r * c)
, где n
s - это элементы вашего массива в стиле 'row-major'.
Таким образом, ваш код для чтения ввода командной строки будет намного проще.
В противном случае, если вы хотите сохранить формат ввода. Вы должны создать «маленький» парсер для чтения этих входных данных. В основном у вас есть 5 «видов» персонажей, с которыми вам нужно иметь дело:
- правая скобка '}'
- левая скобка '{'
- цифры [0-9]
- запятая ','
- пробел ''
Обработка пробела будет немного хитрой, потому что с каждым space
в командной строке argc
увеличивается на единицу.
EDIT:
Вы можете следовать этим указаниям.
NB: Этот код может содержать ошибки, и некоторую логику также необходимо проверить, но это может быть отправной точкой для начала анализа ввода командной строки в указанном вами формате.
int main()
{
int count = 1;
std::vector<vector<int>> arr2d;
std::vector<int> arr1d;
std::string buf;
while(count<argc) {
//accumulate what all you get from command line into string
buf += argv[count];
count++;
}
std::string curr_num;
int num_elements;
int i = 0;
int lparen=0,rparen=0,nrows=0;
char c;
while(i<buf.length()){
c = buf[i];
switch(c) {
case '{':
lparen++;
break;
case '}':
rparen++;
nrows++;
arr2d.push_back(arr1d);
arr1d.clear();
break;
case ' ':
break;
case ',':
num_elements++;
if(curr_num.length() != 0) {
//i'm not sure this will work but you have to do something similar
arr1d.push_back((int)curr_num.c_str());
}
else {//do some error handling}
case '0':
//....
case '9':
curr_num += buf[i];
break;
default:
//throw error;
//there might be other checks you may feel like doing
//you'll get better idea as you start writing on your own.
}
i++;
}
if(lparen || rparen)
//throw error ...
//...
return 0;
}