Как получить массив 2d int из char *? - PullRequest
0 голосов
/ 21 июля 2011

Я хочу передать массив 2d int в основную функцию. Поскольку сигнатура основной функции выглядит следующим образом int main(int argc, char*argv[] Как я могу получить 2d массив в int[][] в моем коде?

Командная строка: myprogram {{2,3},{5,6},{4,5},{6,8},{2,5}}

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Это: {{2,3},{5,6},{4,5},{6,8},{2,5}} закончится как строка в вашей программе.Вам нужно будет разбить его на части, чтобы превратить в массив массивов.

0 голосов
/ 21 июля 2011

Вам необходимо проанализировать ввод командной строки, который вы даете программе. Это может быть немного связано.

То, что вы можете сделать, - вы знаете, что этот массив будет двухмерным. Передайте данные командной строки следующим образом:

myprogram <количество строк (r)> <количество столбцов (c)> n_1 n_2 n_3 .... n_ (r * c)

, где n s - это элементы вашего массива в стиле 'row-major'.

Таким образом, ваш код для чтения ввода командной строки будет намного проще.

В противном случае, если вы хотите сохранить формат ввода. Вы должны создать «маленький» парсер для чтения этих входных данных. В основном у вас есть 5 «видов» персонажей, с которыми вам нужно иметь дело:

  1. правая скобка '}'
  2. левая скобка '{'
  3. цифры [0-9]
  4. запятая ','
  5. пробел ''

Обработка пробела будет немного хитрой, потому что с каждым 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;
}
0 голосов
/ 21 июля 2011

Функция main() принимает либо ничего, либо аргументы командной строки как char * s - вы не можете просто дать ей все, что пожелаете!Вам нужно будет проанализировать char *, чтобы получить нужные вам данные.

Однако вам нужно вводить информацию таким образом?Если он был введен так (просто через cin, а не через аргументы командной строки:

1 2 3
4 5 6
7 8 9

Вы можете присвоить его int a[][], используя что-то вроде этого:

int main() 
{
    const int X=3, Y=3;
    int a[X][Y];
    string currentLine;

    for(int i = 0; i != X; ++i) {
        getline(cin, currentLine);
        istringstream currentInput(currentLine);
        for(int j = 0; j != Y; ++j)
            currentInput >> a[i][j];
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...