Преобразование массива одномерных указателей (char) в массив двумерных указателей (char) в Visual C ++. - PullRequest
0 голосов
/ 27 января 2010

Я новичок в программировании на С ++. Мне нужно вызвать функцию со следующими аргументами. int Start (int argc, char ** argv).

Когда я пытаюсь вызвать вышеуказанную функцию с кодом ниже, я получаю исключения во время выполнения. Может ли кто-нибудь помочь мне в решении вышеуказанной проблемы.

char * filename=NULL;
char **Argument1=NULL;
int Argument=0;
int j = 0;
int k = 0;
int i=0;

int Arg()
{
filename = "Globuss -dc bird.jpg\0";

for(i=0;filename[i]!=NULL;i++)
 {
   if ((const char *)filename[i]!=" ")
    {
   Argument1[j][k++] = NULL; // Here I get An unhandled 
                             // exception of type 
                             //'System.NullReferenceException' 
                             // occurred
       j++;
       k=0; 
    }

   else
    {
       (const char )Argument1[j][k] = filename [j]; // Here I also i get exception
        k++;
        Argument++;
    }
 }

Argument ++;
return 0;
}

Start (Argument,Argument1);

Ответы [ 3 ]

0 голосов
/ 27 января 2010

Две вещи:

char **Argument1=NULL;

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

*Argument1 = new char[10];

for(i=0, i<10; ++i) Argument[i] = new char();

Не забудьте удалить в том жестиль.

0 голосов
/ 27 января 2010

Первое, что вам нужно сделать, это найти количество строк, которые у вас будут. Это легко сделать с чем-то вроде:

int len = strlen(filename);
int numwords = 1;

for(i = 0; i < len; i++) {
    if(filename[i] == ' ') {
        numwords++;
        // eating up all spaces to not count following ' '
        // dont checking if i exceeds len, because it will auto-stop at '\0'
        while(filename[i] == ' ') i++; 
    }
}

В приведенном выше коде я предполагаю, что в имени файла будет хотя бы одно слово (т.е. оно не будет пустой строкой). Теперь вы можете выделить память для Argument1.

Argument1 = new char *[numwords];

После этого у вас есть два варианта:

  1. использовать strtok (http://www.cplusplus.com/reference/clibrary/cstring/strtok/)
  2. реализовать вашу функцию для разделения строки

Это можно сделать так:

int i,cur,last;
for(i = last = cur = 0; cur < len; cur++) {
    while(filename[last] == ' ') { // last should never be ' '
        last++;
    }

    if(filename[cur] == ' ') {
        if(last < cur) {
            Argument1[i] = new char[cur-last+1]; // +1 for string termination '\0'
            strncpy(Argument1[i], &filename[last], cur-last);
            last = cur;
        }
    }
}

Приведенный выше код не оптимизирован, я просто попытался сделать его как можно более простым для понимания. Я тоже не тестировал, но должно работать. Предположения, которые я сделал:

  1. строка заканчивается нулем
  2. в строке есть хотя бы 1 слово.

Также всякий раз, когда я ссылаюсь на строку, я имею в виду массив символов: P

Некоторые ошибки, которые я заметил в вашем коде:

  1. в c / c ++ "" - это указатель на массив const char, который содержит пробел. Если вы сравните это с другим "", вы сравните с ними указатели. Они могут (и, вероятно, будут) разными. Для этого используйте strcmp (http://www.cplusplus.com/reference/clibrary/cstring/strcmp/).
  2. Вы должны научиться динамически распределять память. В c вы можете сделать это с помощью malloc, в c ++ - с помощью malloc и new (лучше использовать new вместо malloc).

Надеюсь, я помог!

PS если в моем коде есть ошибка, сообщите мне и я исправлю ее.

0 голосов
/ 27 января 2010

У вас, похоже, нет выделенной памяти для ваших массивов, у вас просто указатель NULL

char * filename=NULL;
char **Argument1=NULL;
int Argument=0;
int j = 0;
int k = 0;
int i=0;

int Arg()
{
filename = "Globuss -dc bird.jpg\0";

//I dont' know why you have 2D here, you are going to need to allocate
//sizes for both parts of the 2D array
**Argument1 = new char *[TotalFileNames];
for(int x = 0; x < TotalFileNames; x++)
    Argument1[x] = new char[SIZE_OF_WHAT_YOU_NEED];

for(i=0;filename[i]!=NULL;i++)
 {
   if ((const char *)filename[i]!=" ")
{
   Argument1[j][k++] = NULL; // Here I get An unhandled 
                         // exception of type 
                         //'System.NullReferenceException' 
                         // occurred
       j++;
       k=0; 
    }

   else
    {
       (const char )Argument1[j][k] = filename [j]; // Here I also i get exception
        k++;
        Argument++;
    }
   }

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