在Visual C ++中将1D指针数组(char)转换为2D指针数组(char)。

时间:2010-01-27 07:36:25

标签: visual-c++

我是c ++编程的新手我必须使用以下参数调用函数。 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 :(得分:0)

您似乎没有为数组分配任何内存,只需要一个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;
  }

答案 1 :(得分:0)

两件事:

char **Argument1=NULL;

这是指向指针的指针,你需要在内存中分配一些空间。

*Argument1 = new char[10];

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

不要忘记以相同的样式删除。

答案 2 :(得分:0)

您要做的第一件事就是找到您将拥有的字符串数量。这很简单:

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. 实现您的功能以拆分字符串
  3. 可以这样做:

    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. string is null terminated
    2. 字符串中至少有一个单词。
    3. 每当我引用一个字符串时,我的意思是一个char数组:P

      我在你的代码中发现了一些错误:

      1. in c / c ++“”是指向包含空格的const char数组的指针。 如果将它与另一个“”进行比较,您将比较指向它们的指针。他们可能(也可能会)不同。使用strcmp(http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)。
      2. 您应该学习如何分配动态内存。在c中你可以使用malloc,在c ++中使用malloc和new(更好地使用new而不是malloc)。
      3. 希望我帮助过!

        如果我的代码中有错误,请告诉我并解决它。