Visual c++ 在visualc+中将一维指针数组(char)转换为二维指针数组(char)+;。 我是C++编程新手,我必须调用一个函数,并带有下列参数。 整数开始(整数argc,字符**argv)

Visual c++ 在visualc+中将一维指针数组(char)转换为二维指针数组(char)+;。 我是C++编程新手,我必须调用一个函数,并带有下列参数。 整数开始(整数argc,字符**argv),visual-c++,Visual C++,当我尝试用下面的代码调用上面的函数时,会出现运行时异常。有人能帮我解决上述问题吗 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]

当我尝试用下面的代码调用上面的函数时,会出现运行时异常。有人能帮我解决上述问题吗

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);

您似乎没有为数组分配任何内存,您只有一个空指针

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;
  }
char*filename=NULL;
char**Argument1=NULL;
int参数=0;
int j=0;
int k=0;
int i=0;
int Arg()
{
filename=“Globuss-dc bird.jpg\0”;
//我不知道为什么这里有2D,你需要分配
//二维阵列两部分的尺寸
**Argument1=新字符*[TotalFileName];
对于(int x=0;x
两件事:

char **Argument1=NULL;
这是指针对指针,您需要在内存中为它分配一些空间

*Argument1 = new char[10];

for(i=0, i<10; ++i) Argument[i] = new char();
*Argument1=新字符[10];

对于(i=0,i您必须做的第一件事是找到您将拥有的字符串的数量。这很容易通过以下方式完成:

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++; 
    }
}
之后,您有两个选择:

  • 使用strtok()
  • 实现拆分字符串的函数
  • 可以这样做:

    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;
            }
        }
    }
    
    inti,cur,last;
    对于(i=last=cur=0;cur
    上面的代码没有经过优化,我只是尽量让它易于理解。 我也没有测试它,但它应该可以工作。我做了以下假设:

  • 字符串以null结尾
  • 字符串中至少有一个单词
  • 另外,每当我指的是一个字符串时,我指的是一个字符数组:p

    我注意到您的代码中有一些错误:

  • 在c/c++中,是指向包含空格的常量字符数组的指针。 如果将它与另一个“”进行比较,则会将指针与它们进行比较。它们可能(也可能会)不同。为此,请使用strcmp()
  • <> LI>你应该学习如何分配动态内存。在C中,你可以用Maloc,C++中的MALOC和新的(更好地使用新而不是MALOC)。 希望我能帮忙


    PS如果我的代码中有错误,请告诉我,我会修复它。

    这是假设你想要一个2D数组,但我认为你不需要它。如果你想存储多个文件名,比如[0][“文件一”][1][“文件二”][2][“文件三”],你想要一个2D数组[F][i][L][E][O][N][E]嗨,Craig,谢谢你的宝贵建议。我尝试了你的建议,但也遇到了同样的例外。我的主要动机是调用Start(参数,**参数);Function。你知道二维数组是如何工作的吗?我不是说听起来不敬,但你似乎想从代码中得到的是[0][f][1][I][2][l][3][e],作为一个二维数组,您正在分配两个较大的空间。如果您希望它是[0][filename1][1][filename2],只需从循环中删除j++并在每次添加其他文件名时递增它
    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;
            }
        }
    }