调整argVector

时间:2018-10-02 15:27:19

标签: c linux

部分程序如下所示:

char *argVector[] = {"./doTasks","0", "1", "3", NULL};
int numChild = 3;
int temp;
char tempstring[100];

for (int i = 0; i < numChild; i++)
{       
    temp = sprintf(tempstring, "%d", i);
    argVector[1] = tempstring;
    temp = sprintf(tempstring, "%d", 1 + i*3);
    argVector[2] = tempstring;
    printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
}

我的预期输出如下:

第一个循环:

argVector [] = {“ ./doTasks”,“ 0”,“ 1”,“ 3”,NULL}

第二个循环:

argVector [] = {“ ./doTasks”,“ 1”,“ 4”,“ 3”,NULL}

第三个循环:

argVector [] = {“ ./doTasks”,“ 2”,“ 7”,“ 3”,NULL}

但是在实际的控制台显示中,我得到了:

第一个循环:

argVector [] = {“ ./doTasks”,“ 1”,“ 1”,“ 1”,NULL}

第二个循环:

argVector [] = {“ ./doTasks”,“ 4”,“ 4”,“ 4”,NULL}

第三个循环:

argVector [] = {“ ./doTasks”,“ 7”,“ 7”,“ 7”,NULL}

我当前的程序是关于Linux中的多处理的(通过execvp()将argVector传递给子进程; doTasks.c是另一个用于子进程实现的C程序)。无论如何,在走得太远之前,我现在已经陷入了操纵argVector的困境。有人可以解释奇怪的输出吗?提前非常感谢!

1 个答案:

答案 0 :(得分:1)

请注意,在C语言中,与其他语言不同,没有真正的字符串类型。

char *argVector[]不是字符串数组,而是 pointers 的数组。

您想要这个:

#include <stdio.h>

int main()
{
  char *argVector[] = { "./doTasks","0", "1", "3", NULL };
  int numChild = 3;
  char string1[100];
  char string2[100];

  for (int i = 0; i < numChild; i++)
  {
    sprintf(string1, "%d", i);
    argVector[1] = string1;
    sprintf(string2, "%d", 1 + i * 3);
    argVector[2] = string2;
    printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
  }
}

我还删除了int temp;,因为这里没用。

另一种可能性是使用char的2D数组而不是指向char的指针的数组:

#include <stdio.h>

int main()
{
  char argVector[5][20] = { "./doTasks","0", "1", "3", NULL };
  int numChild = 3;

  for (int i = 0; i < numChild; i++)
  {
    sprintf(argVector[1], "%d", i);
    sprintf(argVector[2], "%d", 1 + i * 3);
    printf("argVector is now: %s %s %s %s %s\n", argVector[0], argVector[1], argVector[2], argVector[3], argVector[4]);
  }
}

那样,我们甚至不需要string1,我们可以直接“打印”到argVector

argVector大约由5个字符串组成,每个字符串最多可以包含20个字符,包括NUL终止符。