2012-09-24 63 views
1

我有点麻烦,因为我是C新手,甚至不知道我想做什么是可能的。新阵列和指针

我将一个名为args的数组传递给函数。在函数内部,我还创建了一个名为arrayOfArgs的2D数组。我想要做的就是将参数中的某些值放入名为arrayOfArgs的二维数组中的特定位置。

这是我到目前为止的代码:

int do_command(char **args){ 
     //this is usually a changing variable depending on the situation, but I've hard coded it to make sense 
     int commands = 3; 
     char **arrayOfArgs[commands][10]; 
     //counts which column in arrayOfArgs we are on 
     int commandNum = 0; 

//Counts which part of a command we are on 
     int count = 0; 

    //Array Counters 
    int i = 0; 
    int j; 

    //Go through args until we reach the end 
    while (args[i] != NULL){ 
     if(!strcmp(args[i], "|")){ 
      arrayOfArgs[commandNum][count] = args[i]; 
      count++; 
     } 
     else if (strcmp(args[i], "|")) { 
      count = 0; 
      commandNum++; 
     } 
     //Looking at the next value in args 
     i++; 
    } 

我遇到的问题,因为唯一的事情付诸arrayOfArgs是乱码。我确信我在数组指向的方式,arrayOfArgs的创建方式,或两者都做了错误。

或者是否有可能从一维到二维数组像我试图?

我敢肯定有一个NULL那里,因为前面我把这种循环,它的工作原理:

for(i = 0; args[i] != NULL; i++) { 
    printf("Argument %d: %s\n", i, args[i]); 
} 

谢谢!

+0

我正在写一个C Shell,通过这种方式,我现在正在用管道编写部件。我想分开命令(用符号分隔)到二维数组中。 –

+0

你是否明确地向'args'添加了最后一个'NULL'元素?如果你不是,那么你的循环条件是错误的,并不会正确终止:'args [i]!= NULL' –

+0

我很确定有一个NULL,因为之前我调用一个函数(现在添加到主问题),直到NULL,并工作得很好。 –

回答

0

我想通了。我决定采用1D阵列路线而不是2D路线。代码现在需要args,它们之前被分割为“ls”“-l”“|” “wc”,并根据是否有一个管道变成一个名为“arrayOfCommands”的新数组来分开它们。那么arrayOfCommands的内容就会在“ls -l”和“wc”之后通过。这里的代码:

int do_command(char **args,) { 
    const int commands = 2; 
    int i = 0; 

    int commandNum = 0; 
    int firstCommand = 1; 

    char *arrayOfCommands[commands]; 

    //Go through args until we reach the end 
    while (args[i] != NULL){ 
     //First case    
     if(firstCommand){ 
      arrayOfCommands[commandNum] = args[i]; 
      firstCommand = 0; 
     } 
     //Rest of the cases 
     else{ 
      //if we find something that's not a pipe... 
      if(strcmp(args[i], "|")){ 
       //Add a space to what was a previous part of the same command 
       arrayOfCommands[commandNum] = strcat(arrayOfCommands[commandNum]," "); 
       arrayOfCommands[commandNum] = strcat(arrayOfCommands[commandNum],args[i]); 
      } 
      //But if we do find a pipe... 
      else if (!strcmp(args[i], "|")) { 
       //We know it's time for a new command 
       commandNum++; 
       firstCommand = 1; 
      }    
     } 
     //Looking at the next value in args 
     i++; 
    } 

    for(i = 0; i < commands; i++) 
     printf("Command #[%d]: %s\n", i, arrayOfCommands[i]); 
} 
0

的问题是在这里:

char **arrayOfArgs[commands][10]; 

这声明双字符指针的二维数组,这是不是你想要的。

尝试使用以下代替:

char *arrayOfArgs[commands][10]; 

编辑:改变为char*因为后检查我发现OP分配一个指针指向一个字符阵列,以arrayOfArgs的代码。感谢@ wildplasser的通知。

+0

甚至可能是'char * arrayOfArgs [commands] [10];' – wildplasser

1

首先,你如何验证arrayOfArgs的内容是乱码?你打印的内容是printf吗?你在使用调试器吗?

其次,什么是每个元素arrayOfArgs应该存储?它应该是9个字符或更少的字符串的3元素数组?它应该是一个指向char指针的3x10元素数组吗?它应该是指向char指针的3x10元素指针数组吗?

在线路

arrayOfArgs[commandNum][count] = args[i]; 

表达args[i]具有类型char *;这强烈暗示你打算为arrayOfArgs的每个元素存储char *。在这种情况下,的arrayOfArgs声明更改为

char *arrayOfArgs[commands][10]; 

(I读此作为每个命令可具有多达9个参数)。

督察,它看起来像你试图通过存储指向二维数组中的每个字符串存储类似

 
    col  0  1  2  3  4  5  6  7  8 9 
row 
    0  "cmd" "a1" "a2" NULL NULL NULL ... 
    1  "cmd" "a1" NULL 
... 

如果是这种情况,那么您需要更改arrayOfArgs的声明,如上所述。如果这是不是的情况下,那么你需要给我们一个例子,arrayOfArgs假设看起来像。

0

所以我看到的一些问题...

首先,我相信你的意思是有char arrayOfArgs[commands][10];,只要你想的10个字符串(我想这是你想要的)一个二维数组...否则这将是(所以像字符的四维阵列:P)的字符串指针数组的2D阵列

接着已创建将只复制到每个这些命令的代码缓冲器的字符|如果参数本身是|

如果您正在寻找管道之间的内容ymbols调用函数strchrstrncpy,使用这些函数我将循环遍历每个arg,如果和参数是管道符号|,则使用管道符号查找下一个参数,循环访问它们之间的参数,然后将字符复制到在动态分配的char数组之间

另外,在您的注释中,您说命令数组将是动态的......您的程序结构化数据的方式是静态分配到堆栈上的。要做到这一点,你需要动态分配到堆上,即malloc/calloc